Spring安全核心安全自定义url



我使用grails 2.3.9spring-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
               }
           }
       }
   }
}

最新更新