2015-02-10 60 views
0

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

假设Spring Security的核心(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... 
      } 
     } 
    } 
} 

但该方法表明,它显示在应用程序不只是那些具体到行动中定义的所有角色。

回答

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']为你 “秀” 行动