我不确定如何整合这三个。
我所拥有的是一个简单的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自动完成的?如果是的话,如何在那里启用/转发它?
提前致谢
答案 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_username
和j_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";
}