2

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

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

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

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

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

4

3 回答 3

6

您可以实现一个简单的非身份验证过滤器::

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']
]
于 2013-08-06T22:00:09.507 回答
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'])

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

于 2017-01-03T21:49:06.960 回答
1
grails.plugin.springsecurity.interceptUrlMap = [
    '/api/**': ['IS_AUTHENTICATED_ANONYMOUSLY']
]

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

grails.plugin.springsecurity.securityConfigType = "InterceptUrlMap"

笔记 :

之前的版本:

   grails.plugins.springsecurity.*

新版本 :

  grails.plugin.springsecurity.*//plugin without s
于 2014-09-18T02:17:55.067 回答