Authentication JSF2.0简单登录页面

Authentication JSF2.0简单登录页面,authentication,postgresql,logging,jsf-2,Authentication,Postgresql,Logging,Jsf 2,我需要限制对应用程序一部分的访问。为了访问该部分,用户需要登录。我的数据库中有一个名为User的表,其中有用户名和散列密码,还有一个由两个输入和一个submit组成的登录表单。但是,我不知道应该使用哪些类/数学ID登录用户(我假设jsf中支持此功能)。另外,据我所知,我需要编辑web.xml以支持身份验证。有人能提出一个典型的解决方案和一般步骤,我需要做的,以获得该功能(链接,非常感谢的教程) 我还想知道,如果用户未登录,如何限制对另一个页面的访问,因此当用户键入指向某个页面的直接链接时,他将被

我需要限制对应用程序一部分的访问。为了访问该部分,用户需要登录。我的数据库中有一个名为User的表,其中有用户名和散列密码,还有一个由两个输入和一个submit组成的登录表单。但是,我不知道应该使用哪些类/数学ID登录用户(我假设jsf中支持此功能)。另外,据我所知,我需要编辑web.xml以支持身份验证。有人能提出一个典型的解决方案和一般步骤,我需要做的,以获得该功能(链接,非常感谢的教程)

我还想知道,如果用户未登录,如何限制对另一个页面的访问,因此当用户键入指向某个页面的直接链接时,他将被重定向到主登录页面

提前感谢您的帮助。
Grem.

您可以使用j_安全检查。您所要做的就是发布到它,它将根据您定义的领域和web.xml中特定于应用程序的配置来处理身份验证

根据应用服务器的不同,还有一个附加步骤可以将定义的角色(特定于应用)链接到组(特定于领域)

以下是一个典型配置:

<servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>com.example.Login</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/Login</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>Error</servlet-name>
    <servlet-class>com.example.Error</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Error</servlet-name>
    <url-pattern>/Error</url-pattern>
</servlet-mapping>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>example.com</realm-name>
    <form-login-config>
        <form-login-page>/Login</form-login-page>
        <form-error-page>/Error</form-error-page>
    </form-login-config>
</login-config>

<security-role>
    <role-name>arbitraryRoleName</role-name>
</security-role>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>All Pages</web-resource-name>
        <url-pattern>/index.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>arbitraryRoleName</role-name>
    </auth-constraint>
</security-constraint>

登录
com.example.Login
登录
/登录
错误
com.example.Error
错误
/错误
形式
example.com
/登录
/错误
任意环烯胺
所有页面
/index.xhtml
任意环烯胺

注意
安全角色
。这仍然需要链接到一个组中,或者您定义的任何内容,以区分可以使用页面的用户和不能使用页面的用户。

您可以使用Servlet 3.0中引入的HttpServletRequest API:

    /**
     * Performs authentication via HttpServletRequest API
     */
    public String login(String username, String password) throws IOException {
        try {
            getRequest().login(username, password);
            this.user = userDao.find(username);
        } catch (ServletException e) {
            JsfUtil.addErrorMessage(JsfUtil.getStringResource("loginFailed"));
            return null;
        }
        return "/index?faces-redirect=true";
    }

    public String logout() throws ServletException {
        this.user = null;
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        if (isAuthenticated())
           getRequest().logout();
        return "logout";
    }

    public boolean isAuthenticated() {
        return getRequest().getUserPrincipal() != null;
    }

    public static HttpServletRequest getRequest() {
        Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
        return request instanceof HttpServletRequest
                ? (HttpServletRequest) request : null;
    }

非常感谢,扎克。除了使用j_安全检查,没有其他方法了吗?我知道有一个类具有登录和注销方法,我可以使用,但不记得它的名称。这不是JSF2的一部分。这是Servlet3.0的一部分。因此,只有在Tomcat 7、Glassfish 3、JBoss AS 6等或更高版本上运行JSF 1.x/2.x/whatever时,这才有效。@BalusC感谢您指出这一点。我相应地修改了答案。您有Servlet2.5的解决方案吗?我使用JBoss5.1,它使用Java5。所以我不能用它。如果您有任何建议,那就太好了。您可以使用基于表单的身份验证,使用j_security_check。