我正在实现自己的身份验证机制,我想知道我所做的是正确的,如果不是,我怎么能正确地做到这一点。
首先,我将解释我的身份验证机制是如何工作的:
-用户的详细信息在一个名为Role的对象中。该节点包含3个字段:
email: String
password: String
userType: Enum
-当用户访问系统时,对象Role保存到会话中。
我的问题是:我如何限制访问某些页面的用户(角色)基于他们的userType
字段?
我就是这么做的,但是不管用
首先,我有一个管理bean,检查用户是否被记录。
@ManagedBean
@RequestScoped
public class SecurityController {
//Some attributes...
public String redirectNotBuyer() {
Role role = (Role) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("userRole");
//Checks if user is logged
if (role == null) {
// Please login
//Add message to authentification
return "login.xhtml";
} else if (role != null) {
if (!role.getType().toString().equalsIgnoreCase("BUYER")) {
// Buyer not authorized
return "main.xhtml";
}
}
return null;
}
public String redirectNotSeller() {
Role role = (Role) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("userRole");
if (role == null) {
// Please login
//Add message to authentification
return "login.xhtml";
} else if (role != null) {
if (!role.getType().toString().equalsIgnoreCase("SELLERs")) {
// Buyer not authorized
return "main.xhtml";
}
}
return null;
}
//Getters, setters...
上述两个方法在用户不是买方和卖方的情况下进行重定向。
现在我要做的是在我不希望用户去的页面中调用其中一个方法,这样用户就被重定向到主页面。示例:未经授权的用户进入一个名为buyOffer.xhtml的页面,该页面只有BUYERS可以访问:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<ui:composition template="WEB-INF/templates/BasicTemplate.xhtml">
<!-- THE REGISTRATION FORM -->
<ui:define name="buyOfferForm">
<h2>Buy offer</h2>
#{SecurityController.redirectNotBuyer()}
</ui:define>
</ui:composition>
</html>
由于某种原因,当我与未登录的用户或用户不具有BUYER作为userType的用户一起进入该页时,它不会被重定向到main.xhtml页面。为什么呢?
正确的机制是使用Filter
。
- basic-security-in-jsf