spring security core 安全自定义 url
Posted
技术标签:
【中文标题】spring security core 安全自定义 url【英文标题】:spring security core secure custom url 【发布时间】:2014-10-18 07:26:06 【问题描述】:我使用grails 2.3.9
和spring-security-core:2.0-RC3
并使用staticRules
来保证安全性。
我在Config
文件中有以下安全配置:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.mkb.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.mkb.UserRole'
grails.plugin.springsecurity.authority.className = 'com.mkb.Role'
grails.plugin.springsecurity.useSwitchUserFilter = true
grails.plugin.springsecurity.logout.postOnly = false
grails.plugin.springsecurity.adh.errorPage = null
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
'/': ['permitAll'],
'/index': ['permitAll'],
'/index.gsp': ['permitAll'],
'/**/js/**': ['permitAll'],
'/**/css/**': ['permitAll'],
'/**/images/**': ['permitAll'],
'/**/favicon.ico': ['permitAll'],
'/controllerC/**': ['ROLE_USER'],
'/**': ['permitAll']
]
那里的安全配置工作正常。
现在我关注URL mappings
"/test/controllerA/$action?/$id?(.$format)?"(controller: 'controllerA')
"/test/controllerB/$action?/$id?(.$format)?"(controller: 'controllerB')
我需要为具有/test/
的URL 设置安全性,即具有ROLE_ABC
角色的用户可以访问URL myDomain.com/test/controllerA/**
和myDomain.com/test/controllerB/**
。
我试过了
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
'/': ['permitAll'],
'/index': ['permitAll'],
'/index.gsp': ['permitAll'],
'/**/js/**': ['permitAll'],
'/**/css/**': ['permitAll'],
'/**/images/**': ['permitAll'],
'/**/favicon.ico': ['permitAll'],
'/test/**': ['ROLE_ABC'],
'/**': ['permitAll']
]
但这不起作用,任何用户都可以访问控制器。
我如何定义安全性?
注意:- 我不能使用@Secured
注释。我只需要Config
的证券
【问题讨论】:
嗨 user1690588,你试过 grails.plugin.springsecurity.securityConfigType = "InterceptUrlMap" 吗? (grails-plugins.github.io/grails-spring-security-core/guide/…) @Abincepto:我没有使用InterceptUrlMap
,如果我使用InterceptUrlMap
和staticRules
,那么我的浏览器中会出现“网站有重定向循环”,不会呈现任何屏幕。
您是否在 config.groovy 中添加了下一行? grails.plugin.springsecurity.securityConfigType = "InterceptUrlMap" 你能用所有规则编辑你的帖子吗?
@Abincepto 我的所有安全规则都已发布在问题中。
抱歉,我写的是规则,而不是静态规则。可能与静态规则有交集。
【参考方案1】:
如果任何用户可以访问控制器,您可以使用以下代码。
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
...
'/test/**': ['permitAll'],
...
]
对于特定用户,您可以使用 Spring 安全注释
在类名前添加下面一行。
@Secured(['ROLE_ABC'])
你需要导入
import org.springframework.security.access.annotation.Secured
【讨论】:
我不能使用permitAll
,因为只有具有ROLE_ABC
角色的用户才能访问该URL。我只需要Config
的证券。没有注释。【参考方案2】:
您必须在静态规则中明确指定控制器,如下所示:
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
...
'/controllerA/**': ['ROLE_ABC'],
'/controllerB/**': ['ROLE_ABC'],
....
]
我认为这正是controllerC
所拥有的方式
'/controllerC/**': ['ROLE_USER'],
请参阅this answer for details。与doc suggests 一样,这也适用于来自插件的控制器,如果无法访问源代码,则无法使用@Secured
。
【讨论】:
controllerAnnotations.staticRules entries are treated as if they were annotations on the corresponding controller
。是的,你的回答有帮助,谢谢。抱歉这么晚了,很多票飞来飞去。 :-)
interceptUrlMap
能够处理这种情况。【参考方案3】:
我建议你可以在 Grails 中使用过滤器:http://grails.org/doc/latest/guide/theWebLayer.html#filters 一个例子:
class SecurityFilters
def filters =
loginCheck(controller: '*', action: '*')
before =
if (!session.user && !actionName.equals('login'))
redirect(action: 'login')
return false
【讨论】:
以上是关于spring security core 安全自定义 url的主要内容,如果未能解决你的问题,请参考以下文章
Grails Spring Core 安全插件 - 无法解析类
grails spring security core plugin - 使用用户名和电子邮件登录
grails 2.4.0.M1 中的 spring 安全插件出错
Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core