JSF:如何控制JSF中的访问和权限?

我想在用户login系统后控制访问。

例如:

administrator : can add, delete and give rights to employee employee : fill forms only ... 

所以在知道用户拥有哪个权限之后,在数据库中检查,我想限制这个用户可以看到和做的事情。 有一个简单的方法来做到这一点?

编辑

 @WebFilter("/integra/user/*") public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest) request; Authorization authorization = (Authorization) req.getSession().getAttribute("authorization"); if (authorization != null && authorization.isLoggedIn()) { // User is logged in, so just continue request. chain.doFilter(request, response); } else { // User is not logged in, so redirect to index. HttpServletResponse res = (HttpServletResponse) response; res.sendRedirect(req.getContextPath() + "/integra/login.xhtml"); } } // You need to override init() and destroy() as well, but they can be kept empty. @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } } 

那么这是一个相当广泛的主题。 当你从自制authentication开始,我将针对自制授权的答案。


如果模型devise合理,Java / JSF中的angular色检查就相对简单了。 假设一个用户可以拥有多个angular色(在现实世界的应用程序中经常出现这种情况),那么最终你最终会得到如下的结果:

 public class User { private List<Role> roles; // ... public boolean hasRole(Role role) { return roles.contains(role); } } 
 public enum Role { EMPLOYEE, MANAGER, ADMIN; } 

以便您可以在JSF视图中按如下方式进行检查:

 <h:selectManyCheckbox value="#{user.roles}" disabled="#{not user.hasRole('ADMIN')}"> <f:selectItems value="#{Role}" /> </h:selectManyCheckbox> 
 <h:commandButton value="Delete" rendered="#{user.hasRole('ADMIN')}" /> 

并在你的filter:

 String path = req.getRequestURI().substring(req.getContextPath().length()); if (path.startsWith("/integra/user/admin/") && !user.hasRole(Role.ADMIN)) { res.sendError(HttpServletResponse.SC_UNAUTHORIZED); } 

最难的部分是将这个Java模型转换成一个理智的DB模型。 有几种不同的方式取决于具体的业务需求,每个具有自己的(dis)优势。 或者,您可能已经有了一个必须以Java模型为基础的数据库模型(因此,您需要自下而上devise)?

无论如何,假设您正在使用JPA 2.0(您的问题历史至less证实了这一点),并且您可以自上而下devise,最简单的方法之一是将roles属性映射为@ElementCollectionuser_roles表。 因为我们使用的Role枚举,第二个role表是没有必要的。 这又取决于具体的function和业务需求。

在一般的SQL术语中, user_roles表格可能如下所示:

 CREATE TABLE user_roles ( user_id BIGINT REFERENCES user(id), role VARCHAR(16) NOT NULL, PRIMARY KEY(user_id, role) ) 

然后将其映射如下:

 @ElementCollection(targetClass=Role.class, fetch=FetchType.EAGER) @Enumerated(EnumType.STRING) @CollectionTable(name="user_roles", joinColumns={@JoinColumn(name="user_id")}) @Column(name="role") private List<Role> roles; 

这基本上是所有你需要改变你的User实体。


除了自制身份validation(login/注销)和授权(angular色检查)之外,还有Java EE提供的容器pipe理身份validation ,您可以通过j_security_checkHttpServletRequest#login() , 通过web.xml <security-constraint>过滤HTTP请求web.xml , 通过#{request.remoteUser} 及其angular色#{request.isUserInRole('ADMIN')} 检查login的用户 。

然后有几个第三方框架,如PicketLink , Spring Security , Apache Shiro等,但这是完全没有问题的:)