2

このチュートリアルのセキュリティに従いました この チュートリアルでは、フォームベースのセキュリティのためにこのようなものを追加することが言及されています

<form action="j_security_check" method=post>
    <p>username: <input type="text" name="j_username"></p>
    <p>password: <input type="password" name="j_password"></p>
    <p><input type="submit" value="submit"></p>
</form>

しかし、JSFフォームでは、 h:form にアクション属性がなく、j_security_checkに設定されています。また、フォームベースのセキュリティを提供するために JSF で使用するには、j_username と j_password の使用も必要ですか?

ありがとう

4

2 に答える 2

6

はい、このアクション URL とフィールド名は、フォーム ベースの認証に必須です。これは、サーブレット仕様で指定されています。JSFページでそのまま使用できます。唯一の違いは、フォームの送信と認証が、JSF ではなくコンテナーによって完全に処理されることです。これについて心配する必要はありません。

ただし、フォーム送信プロセスをより細かく制御したい場合、または JSF 組み込みの検証と ajax 機能などを利用したい場合は、JSF マネージド Bean のプログラム認証によっていつでも引き継ぐことができます。HttpServletRequest#login()これには、アクション メソッドで使用する必要があります。認証は引き続きコンテナーによって処理されます。

例えば

<h:form>
    <h:inputText value="#{login.username}" required="true" />
    <h:inputSecret value="#{login.password}" required="true" />
    <h:commandButton value="login" action="#{login.submit}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
    <h:messages />
</h:form>

public String submit() {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

    try {
        request.login(username, password);
        return "home?faces-redirect-true";
    } catch (ServletException e) {
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Unknown login", null));
        return null;
    }
}
于 2012-05-21T14:00:58.587 に答える
1

Websphere 7 で実行する JSF アプリケーションに j_security_check (コンテナ管理セキュリティ) を実装した方法を次に示します。残念ながら、私が使用しているサーブレット API バージョンには

request.login()

j_security_check 呼び出しをインターセプトするために、ログイン フィルタ クラスが作成されました。ResponseWrapper は、ログイン後にリダイレクトされる URL を記憶しています。

public class LoginFilter implements Filter {
        private static String loginPage = "login.xhtml"; // read it from init config
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // create wrapper
        HttpServletRequest req = (HttpServletRequest) request;
        MyWrapper myRes = new MyWrapper((HttpServletResponse) response);
        // call authentication
        chain.doFilter(request, myRes);
        // check for login error
                String redirectURL = myRes.getOriginalRedirect();
          if (StringUtils.isBlank(redirectURL) || redirectURL.contains(loginPage)) {
                   myRes.setOriginalRedirect(homePage);
              }
    myRes.sendMyRedirect();

}
    class MyWrapper extends HttpServletResponseWrapper {
        String originalRedirect;

        public MyWrapper(HttpServletResponse response) {
            super(response);
        }

        @Override
        public void sendRedirect(String location) throws IOException {
            // just store location, don’t send redirect to avoid
            // committing response
            originalRedirect = location;
        }

        // use this method to send redirect after modifying response
        public void sendMyRedirect() throws IOException {
            super.sendRedirect(originalRedirect);
        }

        public String getOriginalRedirect() {
            return originalRedirect;
        }

        public void setOriginalRedirect(String originalRedirect) {
            this.originalRedirect = originalRedirect;
        }


    }

web.xml は次のようになります。

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.servlet.filter.LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/j_security_check</url-pattern>
</filter-mapping>
<filter>
    <filter-name>RequestJSFFilter</filter-name
        <filter-class>com.servlet.filter.RequestJSFFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>RequestJSFFilter</filter-name>
    <url-pattern>*.xhtml</url-pattern>
</filter-mapping>

すべての *.xhtml をインターセプトし、login.xhtml に転送する別のフィルター。login.xhtml では、フォームは次のようになります。

<form action="j_security_check" method=post>
    <p>username: <input type="text" name="j_username"></p>
    <p>password: <input type="password" name="j_password"></p>
    <p><input type="submit" value="submit"></p>
</form>

お役に立てれば。

于 2012-07-06T18:15:46.463 に答える