从过滤器访问控制器方法所需的角色/权限

时间:2015-02-10 18:33:41

标签: grails spring-security grails-filters

是否可以在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']并且如果他们导航显示,则过滤器将获得[&#39] ; ROLE_MANAGER&#39]。我尝试将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...
            }
        }
    }
 }

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

1 个答案:

答案 0 :(得分:1)

试试此代码

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

它应该为你的“索引”动作返回['ROLE_MANAGER','ROLE_USER'],为你的“show”动作返回['ROLE_MANAGER']