spring security core 安全自定义 url

Posted

技术标签:

【中文标题】spring security core 安全自定义 url【英文标题】:spring security core secure custom url 【发布时间】:2014-10-18 07:26:06 【问题描述】:

我使用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 设置安全性,即具有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,如果我使用InterceptUrlMapstaticRules,那么我的浏览器中会出现“网站有重定向循环”,不会呈现任何屏幕。 您是否在 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 security相关认证类详解

Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core

Grails - 卸载 Spring Security Core