ユーザー認証のJava EE/JSFを利用j_security_check
-
18-09-2019 - |
質問
いかに現在のアプローチに関してはユーザ認証のためのウェブアプリケーションを利用当財団2.0(た場合は、成分が存在する)およびJava EE6つのコア機構(ログイン/チェックアクセス権/logouts)ユーザー情報を有するJPAる。は、Oracle社のJava EEチュートリアルは疎ことのみ取り扱うサーブレット).
この なし 利用全体の枠組みのように、Spring-セキュリティ(acegi)、縫い目がいわば、新しいJava EE6プラットフォーム(webプロファイル)が可能です。
解決
、Webを検索し、さまざまな方法を試した後、ここで私は、Java EE 6の認証のためにお勧めしたいものです
セキュリティレルムを設定します。
私の場合、私は、データベース内のユーザーを持っていました。だから、私は、データベーステーブル内のユーザ名とMD5ハッシュパスワードに基づいてユーザーを認証できJDBCレルムを作成するには、このブログの記事に続います:
ます。http://blog.gamatam。 COM / 2009/11 / JDBCレルム・セットアップと-のglassfish-v3.htmlする
注:データベース内のユーザーとグループテーブルについての記事話しています。私は、データベースへのjavax.persistenceアノテーションを経由してマッピングされたのUserType列挙属性を持つUserクラスを持っていました。私は、グループ列としてUSERTYPE列を使用して、ユーザーおよびグループのために同じテーブルでレルムを設定し、それがうまく働いています。
使用フォーム認証:
まだあなたのweb.xmlおよび日-web.xmlの設定、上記のブログの記事に続いて、代わりにBASIC認証、利用形態を使用しての(実際に、あなたが使用しているかは重要ではありませんが、私はFORMを使用して終了)。標準のHTMLではなく、JSFを使用します。
次に、データベースからユーザー情報を初期化する怠惰に上記BalusCの先端を使用しています。彼は顔コンテキストからプリンシパルを取得し、マネージドBeanでそれをやって提案しました。私は、各ユーザのセッション情報を格納するために、代わりに、ステートフル・セッションBeanを使用するので、私は、セッション・コンテキストを注入
@Resource
private SessionContext sessionContext;
がプリンシパルに、私は私のSessionInformation
のEJBでのデータベースとストアからユーザー情報を取得し、EJBエンティティマネージャを使用して、ユーザー名を確認することができます。
ログアウト
私はまた、ログアウトするための最良の方法のために周りを見回しました。私が見つけた最高の一つは、サーブレットを使用しています:
@WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"})
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
// Destroys the session for this user.
if (session != null)
session.invalidate();
// Redirects back to the initial page.
response.sendRedirect(request.getContextPath());
}
}
私の答えは本当に後半の質問の日付を考慮しているが、私は私がやったように、これはGoogleからのここで終わる他の人に役立ちます願っています。
チャオ、
ビトー・ソウザ
他のヒント
と思いきたい 形に基づく認証 を使用 配備記述子 や j_security_check
.
することができますJSFするだけで同じpredefiniedフィールド名 j_username
や j_password
このチュートリアルです。
E.g.
<form action="j_security_check" method="post">
<h:outputLabel for="j_username" value="Username" />
<h:inputText id="j_username" />
<br />
<h:outputLabel for="j_password" value="Password" />
<h:inputSecret id="j_password" />
<br />
<h:commandButton value="Login" />
</form>
ができるようにな怠け者の負荷の User
ゲッターチェックの場合 User
はログインしていれば、その Principal
在する場合には、そのような場合は、取得し User
に伴う j_username
.
package com.stackoverflow.q2206911;
import java.io.IOException;
import java.security.Principal;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@SessionScoped
public class Auth {
private User user; // The JPA entity.
@EJB
private UserService userService;
public User getUser() {
if (user == null) {
Principal principal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
if (principal != null) {
user = userService.find(principal.getName()); // Find User by j_username.
}
}
return user;
}
}
の User
が明らかにアクセス可能JSFエルによる #{auth.user}
.
を用い HttpServletRequest#logout()
(および設定 User
null!).できるハンドルを取得しますの HttpServletRequest
に当財団より ExternalContext#getRequest()
.できるものだけを無効にするセッションです。
public String logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "login?faces-redirect=true";
}
の残(の定義は、ユーザー、役職および制約に配備記述子及び領域)をJava EE6チュートリアルのservletcontainer文書の通常のものです。
更新:にお使いいただけます新しいServlet3.0 HttpServletRequest#login()
なプログインの代わりに j_security_check
につながらないと困る到達できるディスパッチャの一部servletcontainers.この場合ご利用できfullworthy当財団のフォームと豆と username
や password
特性および login
方法のようなものです:
<h:form>
<h:outputLabel for="username" value="Username" />
<h:inputText id="username" value="#{auth.username}" required="true" />
<h:message for="username" />
<br />
<h:outputLabel for="password" value="Password" />
<h:inputSecret id="password" value="#{auth.password}" required="true" />
<h:message for="password" />
<br />
<h:commandButton value="Login" action="#{auth.login}" />
<h:messages globalOnly="true" />
</h:form>
こscoped管理ビーンを記憶では、当初の請求ページ:
@ManagedBean
@ViewScoped
public class Auth {
private String username;
private String password;
private String originalURL;
@PostConstruct
public void init() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
originalURL = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
if (originalURL == null) {
originalURL = externalContext.getRequestContextPath() + "/home.xhtml";
} else {
String originalQuery = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_QUERY_STRING);
if (originalQuery != null) {
originalURL += "?" + originalQuery;
}
}
}
@EJB
private UserService userService;
public void login() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
try {
request.login(username, password);
User user = userService.find(username, password);
externalContext.getSessionMap().put("user", user);
externalContext.redirect(originalURL);
} catch (ServletException e) {
// Handle unknown username/password in request.login().
context.addMessage(null, new FacesMessage("Unknown login"));
}
}
public void logout() throws IOException {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.invalidateSession();
externalContext.redirect(externalContext.getRequestContextPath() + "/login.xhtml");
}
// Getters/setters for username and password.
}
そうすることによって、 User
アクセス可能な当財団によるエル #{user}
.
例えば、完全にフロントコントローラに認証の問題を残すためのオプションであることに言及すべきですApacheのWebサーバーとは、REMOTE_USER環境変数のためのJava表現である、()の代わりにHttpServletRequest.getRemoteUserを評価します。これは、Shibbolethの認証などのデザインでも、洗練されたログを可能にします。 Webサーバーを使用してサーブレットコンテナへのフィルタリング要求そうするために使用されるのmod_jkしばしば、生産環境のための良いデザインです。
問題 HttpServletRequest.loginが設定されていないセッションので認証状態が修正されました3.0.1インチ最新バージョンへのGlassFish更新し、あなたが行われています。
更新は非常に簡単です。
glassfishv3/bin/pkg set-authority -P dev.glassfish.org
glassfishv3/bin/pkg image-update