我正在构建一个需要一些以FN_而不是ROLE_开头的角色/权限的应用程序(Grails Spring Security插件2.0默认只接受ROLE_前缀的权限名称)。
我在grails-app / conf / spring / resources.groovy中为此前缀注册了一个角色投票人,如下所示:
limesPermissionVoter(org.springframework.security.access.vote.RoleVoter) {
rolePrefix = 'FN'
}
我在Config.groovy中定制了选民名单:
grails {
plugin {
springsecurity {
voterNames = [
'authenticatedVoter',
'roleVoter',
'limesPermissionVoter',
'webExpressionVoter'
]
...
据我了解,这应该足以使用我的前缀权限作为注释(如FN_FUNCTION1)来工作。
然而,当我注释一个控制器(@Secured ['FN_FUNCTION1'])时,我在WebExpressionRoot jut上得到一个SpelEvaluationException,就像没有自定义选民一样。
如果我从resources.groovy中删除了bean定义,那么新的选民列表似乎已经处理了。
我在这里缺少什么?
其中一个主要问题似乎是我的FN权限字符串被解析为SpelExpresssions,因此webExpressionVoter想要对它们进行投票。如何将我的FN属性解析为webExpressionVoter弃用的正确ConfigAttributes?
如果我使用“hasRole('FN_FUNCTION1')”代替“FN_FUNCTION1”,一切正常(正如预期的那样,因为这是一个正确的EL表达式)但是如果我不需要为像这样的简单检查。 (注意:如果我使用表达式,我可以完全从配置中省略limesPermissionVoter,因为在这种情况下我们可以允许webExpressionVoter对这些配置属性进行投票)