1

私はそのようなことをしようとしています: https://stackoverflow.com/a/2207147/494826

<security-constraint>
        <display-name>Amministrazione</display-name>
        <web-resource-collection>
            <web-resource-name>wrcollAdmin</web-resource-name>
            <description/>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>admin</role-name>
            <role-name>guest</role-name>
        </auth-constraint>
    </security-constraint>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Risorse</web-resource-name>
            <url-pattern>/javax.faces.resource/*</url-pattern>
        </web-resource-collection>
        <!-- No Auth Contraint! -->
    </security-constraint>

    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.htm</form-login-page>
            <form-error-page>/loginError.htm</form-error-page>
        </form-login-config>
    </login-config>  

私のログイン JSF には以下が含まれます。

<h:form id="loginForm">                 
    <div class="inputlabel">
        <h:outputLabel for="j_username" value="Utente:"/>
    </div>
    <div>
        <h:inputText value="#{loginController.username}" id="j_username" size="25" />
    </div>
    <div class="inputlabel">
        <h:outputLabel for="j_password" value="Password:"/>
    </div>
    <div>
        <h:inputText value="#{loginController.password}" id="j_password" size="25" />
    </div>
    <div>
        <h:commandButton action="#{loginController.login}" value="LOGIN" />
    </div>                  
</h:form>
<h:messages styleClass="errors" />
    ...

そして、ログイン方法は次のとおりです。

public void login() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext externalContext = context.getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
    try {
        log4jLogger.info("LOGIN");
        request.login(username, password);            
        externalContext.redirect("/");
    } catch (ServletException e) {
        log4jLogger.info("DENIED");
        context.addMessage(null, new FacesMessage("Accesso Negato"));        
    }
}

フォームがメソッドを呼び出さないため、これは機能しません。login()なんで?web.xml セキュリティ構成のため、そのように動作すると思います。おそらく、loginController (名前付き@ViewScopedBean) を保護されたリソースと見なしますか?

2 番目の質問は、より一般的なものです。それはプログラムによるセキュリティを達成するための正しい方法ですか?

4

1 に答える 1

1

ログイン ページ自体もセキュリティ制約の制限の対象となり、ログインは によって処理されないj_security_checkため、ログイン ページ自体も許可されたリソースのコレクションに追加する必要があります。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Risorse</web-resource-name>
        <url-pattern>/javax.faces.resource/*</url-pattern>
        <url-pattern>/login.htm</url-pattern>
    </web-resource-collection>
    <!-- No Auth Contraint! -->
</security-constraint>
于 2013-01-11T18:55:52.787 に答える