Grails检查特定控制器操作的角色访问权限

时间:2014-07-03 08:52:31

标签: spring grails spring-security user-permissions user-roles

我需要显示/隐藏操作按钮,具体取决于用户是否可以访问(通过角色定义)特定控制器/操作。我正在使用Spring Security插件。

我的目标是为每个控制器的每个方法使用注释@Secured(“ROLE _...”),我正在寻找一种方法来检查,在调用操作之前,如果用户有权访问这个具体行动。我猜是有办法检查这个,因为注释带来了信息,但我找不到任何解决方案。

在这个例子中,我试图找到HASACCESS方法:

带有@Secured注释的控制器

    class MyExampleController{

      @Secured("ROLE_ADMIN")
      def myMethod(){ do stuff.. }

    }

包含de link

的HTML代码
    <role:link controller="myExample" action="myMethod">Action</role:link>

我的tagLib角色

    class RoleTagLib {
     static namespace = "role"

      def link = {attrs, body ->
        User user = (User) springSecurityService.currentUser          
        if(HASACCESS(user, attrs.controller, attrs.action)){
          out << g.link(attrs, body)
        }
      }
    }

我在this thread中找到了包含在SecurityTagLib中的“hasAccess()”方法,但是此方法受到保护,即使我使用此方法调用SecurityTagLib,也会返回“无签名方法”。 “。我认为它使用Config.groovy中定义的interceptUrlMap而不是注释。

编辑:我成功扩展了安全性tagLib并使用了“hasAccess”方法,但它似乎只使用Config.groovy中包含的interceptUrlMap而不关心我在控制器中添加的注释。

3 个答案:

答案 0 :(得分:5)

使用

<sec:ifAllGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">
  secure stuff here
</sec:ifAllGranted>

<sec:ifAnyGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">
    secure stuff here
</sec:ifAnyGranted>

根据Spring Security Core Grails plugin documentation

或者只需将Spring安全核心taglib与您的标记库一起使用。

class RoleTagLib {
  static namespace = "role"

  SpringSecurityService springSecurityService

  def link = { attrs, body ->
    User user = (User) springSecurityService.currentUser          
    sec.ifAnyGranted(roles: 'ROLE_ADMIN,ROLE_SUPERVISOR'){
      out << g.link(attrs, body)
    }
  }
}

答案 1 :(得分:2)

好的,我找到了解决方案。 SecurityTagLib中的方法“hasAccess”基于Config.groovy中的 grails.plugins.springsecurity.securityConfigType 。我的初始值是 SecurityConfigType.InterceptUrlMap ,然后我会定义每个可访问的网址,并指定哪个角色可以在 grails.plugins.springsecurity.interceptUrlMap <中手动访问每个网址/ p>

解决方法是将其更改为 SecurityConfigType.Annotation ,并将 interceptUrlMap 修改为 staticRules 。然后方法“hasAccess”基于控制器中定义的注释,并且可以使用我的tagLib从SecurityTagLib包装来正确隐藏内容。

Config.groovy中有代码

    grails.plugins.springsecurity.securityConfigType = SecurityConfigType.Annotation
    grails.plugins.springsecurity.staticRules = [
      ... your rules ... for example:
      '/**': ['ROLE_ADMIN_ACCESS'] 
    ]

我的tagLib的代码

    class RoleTagLib extends SecurityTagLib {

        static namespace = "role"

        def link = { attrs, body ->
            if (hasAccess(attrs.clone(), "link")) {
                out << g.link(attrs, body)
            }
        }
    }

我使用它来显示或隐藏我的.gsp文件中的任何链接,基于为每个控制器的每个操作设置的@Secured注释

    <role:link controller="myController" action="myAction">
      Action
    </role:link>

答案 2 :(得分:0)

这是Grails 2.3

要检查来自其他控制器或服务的操作访问权限,请执行以下操作:

@Secured(["ONE_OF_MY_ROLES"])
class SomeController {

    SecurityTagLib securityTagLib = (SecurityTagLib)Holders.grailsApplication.mainContext.getBean('grails.plugins.springsecurity.SecurityTagLib')

    def show() {
        def access = securityTagLib.hasAccess([controller: 'product', action: 'show'], 'access')
    }
}