JAAS + JSF 2.0 + Glassfish

时间:2011-12-10 17:16:51

标签: jsf authentication login glassfish jaas

我不确定如何整合这三个。

我所拥有的是一个简单的jsf登录页面,我也创建了JDBCRealm。 我有简单的数据访问层,它使用jdbc连接到数据库。 我已经限制访问其他页面而不是登录,这非常正常。

  <login-config>
<auth-method>FORM</auth-method>
<realm-name>JDBCRealm</realm-name>
 <form-login-config> 
    <form-login-page>/index.jsf</form-login-page> 
    <form-error-page>/xxx.jsf</form-error-page> 
</form-login-config> 
</login-config>

 <security-constraint>
<web-resource-collection>
    <web-resource-name>Secure Pages</web-resource-name>
    <url-pattern>/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
    <role-name>Users</role-name>
</auth-constraint>
</security-constraint>

我应该怎样做才能真正发挥作用,因为我找不到合适的解决方案: 是这样的吗? - 我是否需要在登录页面下验证我的bean中的密码和登录是否正确?或者它是由这个JDBCRealm中的glassfish自动完成的?如果是的话,如何在那里启用/转发它?

提前致谢

2 个答案:

答案 0 :(得分:3)

登录页面的代码:         

登录表格

    <h:form>
        <h:panelGrid columns="2">

        <h:outputLabel for ="uname" value="Enter User Name :  "/>
        <h:inputText id="uname" value="#{JSFManagedBean.username}"/>
        <h:outputLabel for ="pass" value="Enter Password  :"/>
        <h:inputSecret id="pass" value="#{JSFManagedBean.password}"/>
        <h:outputText/><h:outputText/>
        <h:outputText/>
        <h:commandButton id="login" value="Login" action="#{JSFManagedBean.Login()}"/>
        </h:panelGrid>
    </h:form>
</h:body>

Managed Bean代码:

Managed Bean contain the following Login Method 
    public String Login() {
        try {
            message="";
            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            request.login(username, password);
            if(request.isUserInRole("Admin"))
                return "/AdminPage/Admin.xhtml";
            else if(request.isUserInRole("Visitor"))
                return "/VisitorPage/Visitor.xhtml";
            else {
                message= "Either Login or Password is wrong";
                return "/index.xhtml";
            }

        } catch(Exception e) {
            message= "Either Login or Password is wrong";
        }
        return null;
    }

答案 1 :(得分:2)

在与<form-login-page>相关联的页面中,您需要创建一个外观至少的表单,其中包含URL j_security_check和输入字段名称j_usernamej_password

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

然后容器会拦截它并完全透明地处理它。

如果您想完全自由地使用JSF组件,那么您需要让它在托管bean操作方法中控制登录:

HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();

try {
    request.login(username, password);
    return "home";
} catch (ServletException e) {
    errorMessage = e.getMessage();
    return "error";
}