Grails 3引入了Interceptors来处理诸如对各种控制器操作应用安全性约束之类的事情。
我有一个Thing
控制器,其中包含许多操作。这些行动分为三个不同的组,每个组都需要不同的安全角色。
index
,list
,status
操作需要角色" viewer" edit
,save
操作需要角色"编辑" delete
操作需要安全角色" admin" 我可以将它实现为三个独立的拦截器:
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')
}
}
我有很多像这样的控制器,所以理想情况下,我想在单个拦截器中应用所有这些约束,如下所示:
class ThingInterceptor {
ThingInterceptor(){
match(controller:'thing', action:~/(index|list|status)/)
match(controller:'thing', action:~/(edit|save)/)
match(controller:'thing', action:'delete')
}
...
但是如何确定before
方法中的操作名称?我正在寻找这样的事情:
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')
}
}
有没有办法在单个拦截器中完成此任务,或者我是否必须将其拆分为三个不同的拦截器,每个拦截器一个?
答案 0 :(得分:1)
正如@Joch指出的那样,你可以通过actionName
获取行动名称,但似乎没有任何地方可以记录拦截器。