首页 文章

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

提问于
浏览
3

我需要显示/隐藏操作按钮,具体取决于用户是否可以访问(通过角色定义)特定控制器/操作 . 我正在使用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,也会返回"No signature of method..." . 我认为它使用Config.groovy中定义的interceptUrlMap而不是注释 .

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

3 回答

  • 0

    使用

    <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)
        }
      }
    }
    
  • 2

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

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

    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>
    
  • 4

    这是为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')
        }
    }
    

相关问题