我正在使用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/
的网址设置安全性,即,myDomain.com/test/controllerA/**
和myDomain.com/test/controllerB/**
的网址可由ROLE_ABC
角色的用户访问。< / p>
我试过
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
答案 0 :(得分:3)
您必须在静态规则中明确指定控制器,如下所示:
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
...
'/controllerA/**': ['ROLE_ABC'],
'/controllerB/**': ['ROLE_ABC'],
....
]
我认为这正是你已经将controllerC
作为
'/controllerC/**': ['ROLE_USER'],
参考this answer for details。作为doc suggests,这也适用于插件中的控制器,如果源代码无法访问,则@Secured
无法使用。
答案 1 :(得分:2)
如果任何用户可以访问控制器,您可以使用以下代码。
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
...
'/test/**': ['permitAll'],
...
]
对于特定用户,您可以使用Spring安全注释
在班级名称前添加以下行。
@Secured(['ROLE_ABC'])
您需要导入
import org.springframework.security.access.annotation.Secured
答案 2 :(得分:2)
我建议你可以在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
}
}
}
}
}