【问题标题】:Spring MVC Role and Permission to AdminSpring MVC 角色和管理员权限
【发布时间】:2015-09-14 19:18:42
【问题描述】:

我是 spring mvc 的新手,在我现有的项目中,有一个管理员,他们有权更新数据,但现在我需要创建 2 个新管理员,admin1 和 admin2 他们登录时只能看到有限的页面:

当管理员登录时,他们可以在菜单栏中看到添加数据、更新数据、发布消息页面。 但如果是 Admin1 ,则只能在菜单栏中看到发布消息页面。

所以,请指导我如何在 spring mvc 中完成此任务 提前致谢。

【问题讨论】:

    标签: java spring spring-mvc web-applications user-roles


    【解决方案1】:

    你必须考虑使用 Spring 安全性来实现这一点。检查以下

    <http auto-config="true">
     <intercept-url pattern="/admin*" access="ROLE_ADMIN" />
    </http>
    

    这意味着只有拥有“ROLE_ADMIN”权限的用户才可以访问URI /admin*。如果非授权用户尝试访问,会显示“http 403 access denied page”。

    您必须配置 url 和允许访问它们的权限

    http://www.mkyong.com/spring-security/spring-security-access-control-example/ 的简单示例

    【讨论】:

      【解决方案2】:

      你当然需要两个角色。 - 然后你可以 - 检查角色Admin1 or Admin2Admin1 无处不在。 - 但是您已经提到了一种更好的方法:单独的角色和权限:将角色分配给用户,将权限分配给角色,因此用户通过他的角色获得其权限。现在您只需要检查权限以允许访问某个功能。

      Spring 已经在 14.4 Hierarchical Roles concept 中构建了,但我觉得它很笨拙,因为它要求每个 Voter 都需要了解它。所以我实现了my own solution,它非常简单,并且仅基于 Spring-Security-Roles。因此,只需要更改 Role Provider 即可。

      【讨论】:

        【解决方案3】:

        你需要在 Spring security 中创建两个具有不同访问权限的角色。

        <http auto-config="true">
             <intercept-url pattern="/addData" access="ADMIN_2" />
             <intercept-url pattern="/updateData" access="ADMIN_2" />
             <intercept-url pattern="/postMessage" access="ADMIN_1" />
        </http>
        

        【讨论】:

          【解决方案4】:

          我有一个类似的用例,管理员可能想要创建新角色,并为这些角色任意分配权限。

          如果我要授权用户在他们授予的权限中存在ROLE_*,那么每次有人添加新角色或该角色的业务需求发生变化时,代码都需要更改。

          与@Ralph 一样,我创建了一个库来基于Role to Permissions 注入映射权限,因为我发现缺少分层角色实现...

          在当前安全会话中注入身份验证对象时,它将具有原始角色/授予权限。 例如,您可以在 UserDetailsS​​ervice 或 JWT Authentication Converter 中提供映射权限。

          调用 PermissionProvider 以获取用户所属的每个角色的有效权限。不同的权限列表作为 GrantedAuthority 项添加到 Authentication 对象中。

          然后我可以在配置中使用权限级别授权,并且角色到权限映射可以在运行时更改。

          概念 -

          ADMIN1 -> PERM_ADD, PERM_POST
          ADMIN2 -> PERM_POST, PERM_UPDATE
          

          实现示例 -

          @Autowired 
          RolePermissionsRepository repository;
          
          public void setup1(){
            String roleName = "ROLE_ADMIN1";
            List<String> permissions = new ArrayList<String>();
            permissions.add("PERM_ADD");
            permissions.add("PERM_POST");
            repository.save(new RolePermissions(roleName, permissions));
          } 
          
          public void setup2(){
            String roleName = "ROLE_ADMIN2";
            List<String> permissions = new ArrayList<String>();
            permissions.add("PERM_UPDATE");
            permissions.add("PERM_POST");
            repository.save(new RolePermissions(roleName, permissions));
          }
          

          然后使用权限而不是角色进行访问。

          <http auto-config="true">
               <intercept-url pattern="/addData" access="PERM_ADD" />
               <intercept-url pattern="/updateData" access="PERM_UPDATE" />
               <intercept-url pattern="/postMessage" access="PERM_POST" />
          </http>
          

          或者使用授权注解——

          @PreAuthorize("hasAuthority('PERM_ADD')")
          @RequestMapping("/add")
          public String add() {
            ...
          }
          

          源代码见这里—— https://github.com/savantly-net/spring-role-permissions

          【讨论】:

            猜你喜欢
            • 2013-09-13
            • 2023-01-02
            • 2017-10-16
            • 2017-01-07
            • 1970-01-01
            • 2015-06-24
            • 1970-01-01
            • 1970-01-01
            • 2020-09-01
            相关资源
            最近更新 更多