spring security core安全自定义网址

时间:2014-08-25 07:26:48

标签: spring grails spring-security config roles

我正在使用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/的网址设置安全性,即,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

中的证券

3 个答案:

答案 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
               }
           }
       }
   }
}