您需要将匿名过滤器添加到过滤器链中。
如果您按照 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'])
如果您不使用弹簧安全休息,同样的想法也适用。