【问题标题】:Grails: disable Spring Security Core on certain pathsGrails:在某些路径上禁用 Spring Security Core
【发布时间】:2013-08-06 11:36:25
【问题描述】:

如何以不过滤特定模式(例如 /api/**)的调用方式设置 Spring Security Core?

grails.plugins.springsecurity.filterChain.chainMap = [
'/api/**': '',
'/**': 'JOINED_FILTERS',
]

不起作用,因为它会尝试解析 bean ''。

除了使用 'JOINED_FILTERS,-filter1,-filter2,...' 的讨厌的解决方法之外,还有什么办法吗

如何从 Spring Security 中排除静态资源?

【问题讨论】:

    标签: spring grails spring-security grails-plugin


    【解决方案1】:

    你可以实现一个简单的非认证过滤器::

    class NonAuthenticationFilter  extends GenericFilterBean {
    
        void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            chain.doFilter(request, response);
        }
    }
    

    在 resources.groovy 中定义:

    beans = {
        nonAuthFilter(NonAuthenticationFilter)
    }
    

    并配置您的 url 模式:

    grails.plugins.springsecurity.filterChain.chainMap = [
        '/api/**': 'nonAuthFilter',
        '/**': 'JOINED_FILTERS',
    ]
    grails.plugins.springsecurity.interceptUrlMap = [
        '/api/**': ['IS_AUTHENTICATED_ANONYMOUSLY']
    ]
    

    【讨论】:

    • 非常感谢!为什么我需要 grails.plugins.springsecurity.interceptUrlMap?这是可选的,对吧?它是否与我的 @Secured 注释冲突?
    • 这是 securityConfigType 之一。例如,我使用了 interceptUrlMap。使用哪种方法取决于您。更多信息here
    【解决方案2】:

    您需要将匿名过滤器添加到过滤器链中。 如果您按照 grails spring security rest 配置教程进行操作,您可能会得到以下代码:

    grails.plugin.springsecurity.filterChain.chainMap = [
        //Stateless chain
        [
            pattern: '/**',
            filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'
        ]
    ]
    

    请注意,您有 "-anonymousAuthenticationFilter" ,它会从您的过滤器链中删除此过滤器。 通过从您的代码中删除这部分(-anonymousAuthenticationFilter),此过滤器将返回到您的过滤器链, 因此您可以再次使用 @Secured("permitAll")@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])

    我的最终过滤器链图如下,效果很好。

    grails.plugin.springsecurity.filterChain.chainMap = [
        //Stateless chain
        [
            pattern: '/**',
            filters: 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'
        ]
    ]
    

    当您需要查看有关身份验证过程的更多详细信息时,将其添加到开发环境中的 logback.groovy

    logger("org.springframework.security", DEBUG, ['STDOUT'], false)
    logger("grails.plugin.springsecurity", DEBUG, ['STDOUT'], false)
    logger("org.pac4j", DEBUG, ['STDOUT'], false)
    
    logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false)
    root(ERROR, ['STDOUT', 'FULL_STACKTRACE'])
    

    如果您不使用弹簧安全休息,同样的想法也适用。

    【讨论】:

      【解决方案3】:
      grails.plugin.springsecurity.interceptUrlMap = [
          '/api/**': ['IS_AUTHENTICATED_ANONYMOUSLY']
      ]
      

      这还不够,应该加上这一行:

      grails.plugin.springsecurity.securityConfigType = "InterceptUrlMap"
      

      注意:

      以前的版本:

         grails.plugins.springsecurity.*
      

      新版本:

        grails.plugin.springsecurity.*//plugin without s
      

      【讨论】:

        猜你喜欢
        • 2012-09-24
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 2017-06-20
        • 2013-04-07
        • 2011-09-12
        • 2011-04-22
        • 2016-03-23
        相关资源
        最近更新 更多