[英]Make Grails controller action have public access using Spring Security Rest Plugin
[英]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.