簡體   English   中英

Grails檢查特定控制器操作的角色訪問權限

[英]Grails check role access for specific controller action

我需要顯示/隱藏操作按鈕,具體取決於用戶是否可以訪問(通過角色定義)特定控制器/操作。 我正在使用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)
        }
      }
    }

我在這個線程中找到了包含在SecurityTagLib中的“hasAccess()”方法,但是這個方法受到保護,即使我用我的擴展SecurityTagLib,這個方法的調用也會返回“沒有簽名方法......”。 我認為它使用Config.groovy中定義的interceptUrlMap而不是注釋。

編輯:我成功擴展安全tagLib並使用“hasAccess”方法,但它似乎只使用Config.groovy中包含的interceptUrlMap,並不關心我放在控制器中的注釋。

使用

<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插件文檔

或者只需將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)
    }
  }
}

好的,我找到了解決方案。 SecurityTagLib中的方法“hasAccess”基於Config.groovy中的grails.plugins.springsecurity.securityConfigType 我的初始值是SecurityConfigType.InterceptUrlMap ,然后我會定義每個可訪問的url並指定哪個角色可以在grails.plugins.springsecurity.interceptUrlMap中手動訪問每個url。

解決方案是將其更改為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>

這是為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')
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM