Grails 3引入了Interceptors来处理诸如将安全性约束应用于各种 Controller 操作之类的事情。
我有一个带有许多 Action 的Thing
Controller 。这些操作分为三个不同的组,每个组需要不同的安全角色。
index
,list
,status
操作需要角色“查看者” edit
,save
操作需要角色“编辑者” delete
操作需要安全角色“管理员” 我可以将其实现为三个单独的拦截器:
class ThingInterceptor1 {
ThingInterceptor1(){
match(controller:'thing', action:~/(index|list|status)/)
}
before() {
verifyUserHasRole('viewer')
}
}
class ThingInterceptor2 {
ThingInterceptor1(){
match(controller:'thing', action:~/(edit|save)/)
}
before() {
verifyUserHasRole('editor')
}
}
class ThingInterceptor3 {
ThingInterceptor1(){
match(controller:'thing', action:'delete')
}
before() {
verifyUserHasRole('admin')
}
}
我有很多这样的 Controller ,所以理想情况下,我想将所有这些约束应用于单个拦截器,如下所示:
class ThingInterceptor {
ThingInterceptor(){
match(controller:'thing', action:~/(index|list|status)/)
match(controller:'thing', action:~/(edit|save)/)
match(controller:'thing', action:'delete')
}
...
但是,如何确定
before
方法中的 Action 名称?我正在寻找这样的东西:before() {
def actionName = ????
if(actionName.matches(~/(index|list|status)/)){
verifyUserHasRole('viewer')
}
else if(actionName.matches(~/(edit|save)/){
verifyUserHasRole('editor')
}
else if(actionName == 'delete'){
verifyUserHasRole('admin')
}
}
是否有任何方法可以在单个拦截器中完成此操作,还是我必须将其分为三个不同的拦截器,每组 Action 一个?
最佳答案
正如@Joch指出的那样,您可以通过actionName
来获取 Action 名称,但是对于Interceptor而言,似乎没有任何记录。
关于grails - 如何使用拦截器为Grails 3中的每种方法应用不同的安全性约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38860871/