grails spring-security 插件保护所有控制器,而不仅仅是带有@Secured注解的控制器

Posted

技术标签:

【中文标题】grails spring-security 插件保护所有控制器,而不仅仅是带有@Secured注解的控制器【英文标题】:grails spring-security plugin secures all controllers instead of just ones with @Secured annotation 【发布时间】:2015-01-28 18:50:11 【问题描述】:

我正在关注tutorials 使用springsecurity 身份验证插件。我正在使用 grails 版本 2.3.8 和 spring-security-core:2.0-RC2。它按预期工作,使用 Secured 注释创建 HelloWorld 控制器:

package basicauthdemo
import grails.plugin.springsecurity.annotation.Secured

class HelloController 
    @Secured(['ROLE_USER'])
    def index() 
    render "Hello World"
    

然后显示登录屏幕。

我的问题是,当我创建另一个没有 @Secured 注释的控制器时。导航到该控制器时,我仍然会看到登录屏幕。 Spring security 现在负责对我的控制器的所有访问,正如我从生成的 web.xml 中的过滤器映射中看到的那样:

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

如何告诉插件允许开放访问某些控制器而不是其他控制器?我认为这将由 @Secured 注释的存在来确定,但这仅定义了具有控制器权限的角色。

【问题讨论】:

【参考方案1】:

根据 Spring Security Core 插件的documentation,默认行为是pessimistic lockdown

... 然后是任何没有请求映射的 URL(注释、条目 在controllerAnnotations.staticRules 或interceptUrlMap,或一个 Requestmap 实例)将被所有用户拒绝。

我强烈建议您阅读文档的特定部分,了解如何配置插件以供您使用。通常这将修改rejectIfNoRule 的默认值并配置适当的staticRules

【讨论】:

以上是关于grails spring-security 插件保护所有控制器,而不仅仅是带有@Secured注解的控制器的主要内容,如果未能解决你的问题,请参考以下文章

Spring-security/Grails 应用程序 - 未调用自定义 WebSecurity 配置

在 Grails 中使用 Pre/Post Spring-Security Annotations

休息资源的 Grails spring-security 静态规则似乎无法正常工作

Grails Spring Security 插件身份验证失败

Grails Spring-Security - 如何比较密码-

使用 spring-security-core 插件将 Facebook 登录 (oauth) 与现有 grails 应用程序集成