我的问题是Custom annotation with spring security的重复,但它没有得到回答,我相信应该有一个简单的解决方案来解决这个问题。
基本上不是在做:
@PreAuthorize("hasPermission(T(fully.qualified.Someclass).WHATEVER, T(fully.qualified.Permission).READ")
我想做的是:
@PreAuthorize(Someclass.WHATEVER, Permission.READ)
或者可能是一些自定义注解,这些注解可以很容易地与Spring Security连接起来
这对我来说似乎干净多了,如果可以的话,我希望能够做到。
6条答案
按热度按时间kd3sttzy1#
实际上,您可以实现一个自定义的强类型安全注解,尽管这相当麻烦。
声明安全管道要使用的
org.springframework.security.access.ConfigAttribute
的自定义实现声明
org.springframework.security.access.method.MethodSecurityMetadataSource
的自定义实现,以便从注解创建SecurityAttribute
的示例最后声明自定义实现
org.springframework.security.access.AccessDecisionVoter
现在将它们全部整合到您的
MethodSecurityConfig
中kuhbmx9i2#
您可以建立如下所示的静态注解:
通过移动
@PreAuthorize
注解到@ReadPermission
定义:这样做的好处是,您可以在一个位置更改Spring SPEL表达式,而不是在每个方法上修改它。
还有一个好处是,你可以在类级别上使用这个注解--每个方法都可以用这个注解来保护。它对AdminControllers等很有用。
f0ofjuux3#
面对同样的问题,我最终采用了一个混合解决方案,我使用Spring-El和一个自定义bean来提供我自己的
hasPermission()
方法,该方法接受一个Enum,假设Spring在运行时进行自动的string->enum
转换,如果字符串中有输入错误,我将得到一个运行时异常,即某个特定的枚举不存在。(我宁愿有编译时失败的东西),但这是一个可以接受的折衷方案。它提供了一些半类型安全。用法如下:
其中Permission只是一个普通的枚举定义:
希望这能在将来帮助其他人摆脱困境。
gg58donl4#
何月道:
1 -定义引用公共最终静态字符串“VALUE”的枚举,如下所示
2 -在@预授权中级联MyEnum值
lg40wkob5#
我创建了自己的注解,它在参数中获取枚举。在实现注解时,我创建了一个方法,它获取注解中指定的所有角色,并验证当前用户是否至少拥有其中一个角色。如果没有匹配的角色,程序将抛出异常。
枚举:
注解界面:
注解的实作:
用法:
ne5o7dgx6#
我找到了一个解决方案。虽然有点麻烦,但很有效。