如何使用拦截器为 Grails 3 中的每个方法应用不同的安全约束

How to apply different security constraints for each method in Grails 3, using interceptors

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

我有一个 Thing 控制器,有很多操作。这些操作分为三个不同的组,每个组都需要不同的安全角色。

我可以将其实现为三个独立的拦截器:

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')
    }
}

有没有办法在一个拦截器中完成这个,或者我必须把它分成三个不同的拦截器,一个用于每组动作?

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