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

我有一个带有许多 Action 的Thing Controller 。这些操作分为三个不同的组,每个组需要不同的安全角色。

  • indexliststatus操作需要角色“查看者”
  • editsave操作需要角色“编辑者”
  • 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/

    10-12 16:00