gpt4 book ai didi

java - 权限代码和名称的 Spring Security 表达式

转载 作者:行者123 更新时间:2023-11-30 10:38:12 25 4
gpt4 key购买 nike

在我的 Spring Security 项目中,我有以下使用 @PreAuthorize 注释保护的方法:

@PreAuthorize("hasAnyAuthority('PERMISSION_UPDATE_OWN_DECISION', 'PERMISSION_UPDATE_ANY_DECISION')")
@RequestMapping(value = "/{decisionId}/update", method = RequestMethod.POST)
public DecisionResponse updateDecision(@PathVariable @NotNull @DecimalMin("0") Long decisionId, @Valid @RequestBody UpdateDecisionRequest decisionRequest) {
....
}

我还将 Spring OAuth2 与 JWT token 一起使用,并将所有权限存储在此 token 中。现在,我使用了很长的权限名称,例如 PERMISSION_UPDATE_OWN_DECISION 并想替换它们以显着减少 JWT token 大小(权限部分)。

enter image description here

其中一个想法是引入权限代码,比如:

1, PERMISSION_UPDATE_OWN_DECISION
2, PERMISSION_UPDATE_ANY_DECISION

其中 1 是权限代码,PERMISSION_UPDATE_OWN_DECISION 是权限名称。

但是我不想直接使用这些代码,因为它会降低我代码的可读性,例如:

@PreAuthorize("hasAnyAuthority('1', '2')")

取而代之的是,我想使用一些允许我根据真实权限名称检索此代码的东西,例如:

@PreAuthorize("hasAnyAuthority(getCode('PERMISSION_UPDATE_OWN_DECISION')), getCode('PERMISSION_UPDATE_ANY_DECISION'))")

如何使用 Spring Security 和 Spring Security Expressions 正确实现它?可能有一些预先构建的方法来实现这一点?

最佳答案

首先,您需要子类化 MethodSecurityExpressionRoot 并根据您的逻辑创建一个自定义类。

public class CustomMethodSecurityExpressionRoot extends MethodSecurityExpressionRoot {
public boolean hasAnyAuthorityWithCodes(String... codes) {
String[] ids = // Your custom Logic to get Ids from Code

return hasAnyAuthority(ids);
}

}

然后子类 DefaultMethodSecurityExpressionHandler 并覆盖它的 createEvaluationContext 方法。

@Override
public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) {
MethodSecurityEvaluationContext ctx = new MethodSecurityEvaluationContext(auth, mi, parameterNameDiscoverer);
MethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(auth);
root.setTrustResolver(trustResolver);
root.setPermissionEvaluator(permissionEvaluator);
root.setRoleHierarchy(roleHierarchy);
ctx.setRootObject(root);

return ctx;
}

最后,您可以在您的配置中使用这个自定义的 DefaultMethodSecurityExpressionHandler

<global-method-security>
<expression-handler ref="customMethodSecurityExpressionHandler"/>
</global-method-security>

并使用

@PreAuthorize("hasAnyAuthorityWithCodes('PERMISSION_UPDATE_OWN_DECISION','PERMISSION_UPDATE_ANY_DECISION')")

更新

子类 DefaultMethodSecurityExpressionHandler 并覆盖 createSecurityExpressionRoot 方法

    protected MethodSecurityExpressionOperations createSecurityExpressionRoot(
Authentication authentication, MethodInvocation invocation) {
MethodSecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(
authentication);
root.setThis(invocation.getThis());
root.setTrustResolver(trustResolver);
root.setPermissionEvaluator(permissionEvaluator);
root.setRoleHierarchy(roleHierarchy);
root.setDefaultRolePrefix(defauleRolePrefix);

return root;
}

关于java - 权限代码和名称的 Spring Security 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39830365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com