【问题标题】:Accessing a controller method's required roles/authorities from a filter从过滤器访问控制器方法所需的角色/权限
【发布时间】:2015-04-10 22:15:54
【问题描述】:

是否可以在 Grails 过滤器中检索特定控制器操作/方法所需的角色/权限列表?

假设安装了 Spring Security Core (2.0.x) 插件和一个使用 @Secured 注解的控制器,例如:

class PersonController {

    @Secured(['ROLE_MANAGER','ROLE_USER'])
    def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        respond Person.list(params), model:[personInstanceCount: Person.count()]
    }

    @Secured(['ROLE_MANAGER'])
    def show(Person personInstance) {
        respond personInstance
    }
}

如果用户导航到索引操作,过滤器会得到 ['ROLE_MANAGER', 'ROLE_USER'],如果他们导航到显示,过滤器会得到 ['ROLE_MANAGER']。我尝试将objectDefinitionSource 注入过滤器并使用objectDefinitionSource.allConfigAttributes,如下所示:

class MyFilters {

    def objectDefinitionSource    

    def filters = {
        all(controller:'assets', action:'*', invert: true) {
            before = {
                // get list of spring security roles required for the controller's action
                objectDefinitionSource.allConfigAttributes.each { println it }
                // additional filter behavior...
            }
        }
    }
 }

但正如该方法所建议的那样,它会显示应用中定义的所有角色,而不仅仅是特定于该操作的角色。

【问题讨论】:

    标签: grails spring-security grails-filters


    【解决方案1】:

    试试这个代码

    def ctrlClass = grailsApplication.getArtefactByLogicalPropertyName("Controller", controllerName).clazz
    def roles = ctrlClass.getDeclaredMethod(actionName).getAnnotation(grails.plugin.springsecurity.annotation.Secured).value()
    

    它应该为您的“索引”操作返回 ['ROLE_MANAGER','ROLE_USER'],为您的“显示”操作返回 ['ROLE_MANAGER']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 2023-04-06
      • 1970-01-01
      • 2013-02-23
      • 2014-01-25
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多