如何在JSF中控制访问和权限?
我想在用户登录我的系统后控制访问 例如:如何在JSF中控制访问和权限?,jsf,jsf-2,servlet-filters,login-control,Jsf,Jsf 2,Servlet Filters,Login Control,我想在用户登录我的系统后控制访问 例如: administrator : can add, delete and give rights to employee employee : fill forms only ... 所以在知道用户拥有哪个权限后,在数据库中进行检查,我想限制这个用户可以看到和做什么。 有一个简单的方法吗 编辑 @WebFilter("/integra/user/*") public class LoginFilter implements Filter { @
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() {
}
}
这是一个相当广泛的话题。当您从自制身份验证开始时,我将针对自制授权给出答案
如果模型设计合理,Java/JSF中的角色检查本身就相对简单。假设一个用户可以有多个角色(在现实世界的应用程序中经常是这样),那么最终您可能希望拥有以下角色:
public class User {
private List<Role> roles;
// ...
public boolean hasRole(Role role) {
return roles.contains(role);
}
}
因此,您可以在JSF视图中进行如下检查:
在您的过滤器中:
String path=req.getRequestURI().substring(req.getContextPath().length());
if(path.startsWith(“/integra/user/admin/”&&!user.hasRole(Role.admin)){
res.senderro(HttpServletResponse.SC_未经授权);
}
最困难的部分是将此Java模型转换为sane DB模型。根据具体的业务需求,有几种不同的方法,每种方法都有自己的优点。或者您已经有了一个DB模型,您必须基于它来构建Java模型(因此,您需要设计自底向上的模型) 无论如何,假设您使用的是JPA2.0(您的问题历史记录至少证实了这一点),并且您可以自上而下地进行设计,最简单的方法之一就是将
角色
属性映射为与用户角色
表相对应的属性。当我们使用角色
枚举时,不需要第二个角色
表。同样,这取决于具体的功能和业务需求
在通用SQL术语中,user\u roles
表可以如下所示:
创建表用户角色(
用户id BIGINT引用用户(id),
角色VARCHAR(16)不为空,
主键(用户id、角色)
)
然后将其映射如下:
@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;
@ElementCollection(targetClass=Role.class,fetch=FetchType.EAGER)
@枚举(EnumType.STRING)
@CollectionTable(name=“user\u roles”,joinColumns={@JoinColumn(name=“user\u id”)})
@列(name=“role”)
私有列表角色;
这基本上就是您需要在用户
实体中更改的全部内容
除了自制的身份验证(登录/注销)和授权(角色检查)之外,还提供了JavaEE,您可以使用它,等等
还有一些第三方框架,如、等,但这是不可能的:)您如何验证用户?通过容器管理的身份验证(
j_security\u check
或request.login()
)或通过会话属性上自制的servlet过滤器?@BalusC,你好,我的朋友!好久没和你说话了。我正在使用一个servlet过滤器,这是你很久以前教我的,我将在这里发布。你可以检查一下,我们必须创建一个自定义EL函数来检查用户是否有特定的角色(例如在渲染属性中使用),我自己对此很好奇。我真的记不起seam 3安全性的范围,也记不起codi中类似的概念,但它们可能有用。Deltaspike将为V0.4(下一个)iirc添加此项。我也偷看了ApacheShiro,但决定不看。我已经决定暂时停止我的auth逻辑,等待deltaspikeIt's good的v.04。您已经提到了那些提供安全性的库,AA.)回答得好,鲍克,我要试试这个!谢谢Seam安全链接已断开(应指向)。现在它似乎已经转移到了PicketLink