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

角色的springspel

彭风华
2023-03-14

我有一个自定义需求,我想根据特定角色决定是否可以访问API。我使用的是Spring框架。我想支持这样的观点:

1. (R1 || R2) && (R3 || R4)  
2. (R1) || (R2 && R3) 

其中R表示一个角色<代码>|和

我用SPEL找到了类似的东西,但不是R,它可以是任何字符串,如客户,员工等,他们使用布尔表达式值,如true6==6


共有2个答案

徐帅
2023-03-14

我用下面的方法解决了上面的问题:

  1. 我使用Spring提供的SpEL
  2. SpEL支持属性替换

替换代码:

Inventor tesla = new Inventor("Nikola Tesla");
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("name == Nikola Tesla");
String name = (String) exp.getValue(tesla);

此处,名称属性将被尼古拉·特斯拉(Nikola Tesla)取代。当每次计算表达式时,name属性具有不同的值时,应使用此选项。如果<>代码>名称< /代码>属性每次都相同,请考虑使用<代码>评估上下文> /代码>。

现在讨论布尔表达式,您必须强制替换属性的值,因为在上面的示例中,属性name可以将null作为默认值,但是字符串角色不能在不替换的情况下将truefalse作为默认值
假设SpEL包含一些我不知道的角色,我将无法用truefalse替换它们。为了解决这个问题,我使用了类似于@PreAuthorize的方法,它的方法是hasRole()

参考代码:

String roles =  "(hasRole('admin') or hasRole('superAdmin')) and hasRole('modifier')"
Expression roleExpression = parser.parseExpression(roles);
StandardEvaluationContext roleContext = new StandardEvaluationContext(new SpelHelper());
roleContext.addPropertyAccessor(new MapAccessor()); // this line might be useless
Boolean hasCorrectRole = roleExpression.getValue(roleContext, Boolean.class);


class SpelHelper {
     public boolean hasRole(String role) {
          // some logic like current user roles have the role passed as argument
          return true;
     }
}

完整文档位于:https://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/expressions.html

此外,参考Java中的布尔表达式评估
这个答案建议使用JEXL,这个答案会给你一个公平的想法,如何替换属性。

年业
2023-03-14

可以使用基于角色的SpEL方法安全性。

@PreAuthorize("hasRole('ROLE_A') or hasRole('ROLE_B')")
public void yourMethod() {
    // ...
}
 类似资料:
  • 角色是一系列权限的集合,用户加入项目时的角色决定了用户在项目中的权限。 角色是一系列权限的集合,用户加入项目时的角色决定了用户在项目中的权限。 系统内置角色说明如下: 角色 权限 是否共享 权限范围 权限说明 admin sysadmin 全局共享 系统 用户只有以admin角色加入default的system项目时才有管理后台全部权限。 domainadmin domainadmin 全局共享

  • 角色定义了对集群的指定命名空间下资源的权限。 角色定义了对集群的指定命名空间下资源的权限。多集群角色支持将角色关联到多个集群,并在指定集群中创建同样权限的角色。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “容器/多集群资源/角色” 菜单项,进入角色页面。 新建角色 该功能用于新建多集群角色。新建多集群角色之前请先创建多集群命名空间。 在角色页面,单击列表上方 “新建” 按钮,进

  • 角色定义了对集群的指定命名空间下资源的权限。 角色定义了对指定命名空间里资源的权限,通过与服务账户进行绑定,从而控制服务账户的操作权限。 角色的详细介绍请参考Kubernetes官方文档-RBAC。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “容器/集群/角色” 菜单项,进入角色页面。 查看角色 该功能用于基于集群、命名空间筛选角色信息。 在角色页面,默认查看一个集群下所有命名

  • 安全角色是由应用开发人员或装配人员定义的逻辑用户分组。当部署了应用,由部署人员映射角色到运行时环境的 principal 或组。 Servlet 容器根据 principal 的安全属性为与进入请求相关的principal 实施声明式或编程式安全。 这可能以如下任一方式发生: 部署人员已经映射一个安全角色到运行环境中的一个用户组。调用的principal 所属的用户组取自其安全属性。仅当 prin

  • 作用 用于查询在滴滴管理后台添加的角色列表,同时为员工添加时绑定角色提供相应的数据。 依赖 需要先在滴滴管理后台增加需要的角色,此时该接口才能获取到数据。 注意 所有接口调用时需要严格遵守请求方式(GET/POST) 使用接口前需要仔细阅读每个接口的注意事项 接口报错时先阅读通用错误解决方案和当前接口文档下的接口错误解决方案

  • OAuth定义了四种角色: 资源所有者 能够许可对受保护资源的访问权限的实体。当资源所有者是个人时,它被称为最终用户。 资源服务器 托管受保护资源的服务器,能够接收和响应使用访问令牌对受保护资源的请求。 客户端 使用资源所有者的授权代表资源所有者发起对受保护资源的请求的应用程序。术语“客户端”并非特指任何特定的的实现特点(例如:应用程序是否是在服务器、台式机或其他设备上执行)。 授权服务器 在成功