Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JSF中控制访问和权限?_Jsf_Jsf 2_Servlet Filters_Login Control - Fatal编程技术网

如何在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