当前位置: 首页 > 知识库问答 >
问题:

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

欧博简
2023-03-14

我想在用户登录我的系统后控制访问。

例如:

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() {
    }
}

共有1个答案

东和怡
2023-03-14

这是一个相当广泛的话题。当您从自制身份验证开始时,我将针对自制授权给出答案。

如果模型设计合理,Java/JSF中的角色检查本身就相对简单。假设一个用户可以有多个角色(在现实世界的应用程序中经常是这样),那么最终您可能希望拥有以下角色:

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')}" />

在您的过滤器中:

String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/integra/user/admin/") && !user.hasRole(Role.ADMIN)) {
    res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}

最困难的部分是将此Java模型转换为sane DB模型。根据具体的业务需求,有几种不同的方法,每种方法都有自己的优点。或者您已经有了一个DB模型,您必须基于它来构建Java模型(因此,您需要设计自底向上的模型)?

无论如何,假设您正在使用JPA2.0(您的问题历史至少证实了这一点),并且您可以自顶向下设计,最简单的方法之一是将角色属性映射为@ElementCollectionuser_roles表。由于我们使用的是Role枚举,因此不需要第二个角色表。同样,这取决于具体的功能和业务需求。

在通用SQL术语中,user\u 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;

这基本上就是您需要在用户实体中更改的全部内容。

除了自制的身份验证(登录/注销)和授权(角色检查)之外,还有Java EE提供的容器管理身份验证,您可以通过j_security\u checkHttpServletRequest#login(),按

还有一些第三方框架,如PicketLink、Spring Security、ApacheShiro等,但这是不可能的:)

 类似资料:
  • 主要内容:开启 ACL 权限Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。比如,我们可以通过 ls -l 命令查看当前目录中所有文件的详细信息,其中就包含对各文件的权限设置: [root@localhost ~]# ls -l total 36 drwxr-xr-x. 2 root root 4096 Apr 15 16:33

  • 我们将用户权限存储在声明中。 下面是企业客户索赔的样子: 然后,当用户试图使用从web检索文件的下载URL时,Firebase抛出一个权限错误。 你能提供一个解决方案吗?

  • 本文向大家介绍理解Java访问权限控制,包括了理解Java访问权限控制的使用技巧和注意事项,需要的朋友参考一下 今天我们来一起了解一下Java语言中的访问权限控制。在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制。考虑两个场景:   场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理?   场景2:如果工程师A编写了一个

  • 认证(Authentication)是指任何识别用户身份的过程。授权(Authorization)是允许特定用户访问特定区域或信息的过程。 相关模块和指令 认证和授权涉及到三组模块。通常,你需要从每一组中选择至少一个模块。 认证类型模块(参见AuthType指令) mod_auth_basic mod_auth_digest 认证支持模块 mod_authn_alias mod_authn_ano

  • Kubernetes 从 1.6 开始支持基于角色的访问控制机制(Role-Based Access,RBAC),集群管理员可以对用户或服务账号的角色进行更精确的资源访问控制。在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角

  • 原文再续,书折第一回。 很多其他编程语言都有一种”protected“设定,可以限制某些类方法只能被它的子类所使用。 Swift支持了访问控制后,大家给我们的反馈都很不错。而有的开发者问我们:“为什么Swift没有类似protected的选项?” 当我们在设计Swift访问控制的不同等级时,我们认为有两种主要场景: 在一个APP里:隐藏某个类的私密细节。 在一个开源框架里:不让导入这个框架的APP