如何使用拦截器

时间:2016-08-09 21:39:12

标签: grails grails-3.0

Grails 3引入了Interceptors来处理诸如对各种控制器操作应用安全性约束之类的事情。

我有一个Thing控制器,其中包含许多操作。这些行动分为三个不同的组,每个组都需要不同的安全角色。

  • indexliststatus操作需要角色" viewer"
  • editsave操作需要角色"编辑"
  • 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')
    }
}

有没有办法在单个拦截器中完成此任务,或者我是否必须将其拆分为三个不同的拦截器,每个拦截器一个?

1 个答案:

答案 0 :(得分:1)

正如@Joch指出的那样,你可以通过actionName获取行动名称,但似乎没有任何地方可以记录拦截器。