我使用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的安全性,即。, url myDomain.com/test/controllerA/**
和myDomain.com/test/controllerB/**
可以被具有ROLE_ABC
角色的用户访问。
我试过了
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
中的证券
您必须在静态规则中显式指定控制器,如下所示:
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
...
'/controllerA/**': ['ROLE_ABC'],
'/controllerB/**': ['ROLE_ABC'],
....
]
我认为这正是你已经为controllerC
设置的
'/controllerC/**': ['ROLE_USER'],
参考答案了解细节。正如文档所建议的,这也适用于控制器从插件,其中@Secured
不能使用,如果源代码是不可达的。
如果任何用户都可以访问控制器,则可以使用下面的代码。
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
...
'/test/**': ['permitAll'],
...
]
对于特定用户,您可以使用Spring安全注释
在类名之前添加下面一行。
@Secured(['ROLE_ABC'])
你需要导入
import org.springframework.security.access.annotation.Secured
我建议您可以在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
}
}
}
}
}