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
属性映射为@ElementCollection
与user_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_check
或HttpServletRequest#login()
, 通过web.xml
<security-constraint>
过滤HTTP请求web.xml
, 通过#{request.remoteUser}
及其angular色#{request.isUserInRole('ADMIN')}
检查login的用户 。
然后有几个第三方框架,如PicketLink , Spring Security , Apache Shiro等,但这是完全没有问题的:)
- PrimeFaces 4.0 / JSF 2.2.x中的AJAX无法使用file upload – javax.servlet.ServletException:请求内容types不是多部分/表单数据
- h:outputText不会将\ r \ n字符分隔成新的行
- 推迟加载和parsingPrimeFaces JavaScript文件
- JSF 2.0从浏览器和编程设置整个会话的区域设置
- 识别并解决javax.el.PropertyNotFoundException:目标无法访问
- JSF中的无状态有什么用处?
- PrimeFaces CSS look'n'feel丢失和JS“未捕获的参考错误:PrimeFaces未定义”
- h:绑定到Integer属性的inputText正在提交值0而不是null
- 在ajax调用<f:ajax>之后处理onclick函数