如何防止 Grails 3 创建会话?

Posted

技术标签:

【中文标题】如何防止 Grails 3 创建会话?【英文标题】:How can I prevent Grails 3 from ever creating a session? 【发布时间】:2016-09-10 13:55:18 【问题描述】:

我有一个 Grails 3.1 应用程序并使用 spring 安全插件,并带有一个自定义的无状态身份验证提供程序。这一切都有效,但是当没有会话和创建会话(带有会话 ID cookie)时,我仍然会重定向到我的登录屏幕。

如何指示 Spring Security 永远不要使用 cookie,或者让 grails 永远不允许创建它们?我已经看到了一些关于普通弹簧安全的答案,但是使用 Grails 弹簧安全插件,事情似乎有所不同。

【问题讨论】:

【参考方案1】:

Spring Security 插件与过滤器一起使用,其中一个可能会将您重定向到登录页面。我不知道您是如何自定义身份验证的,但基于Spring Security REST Plugin,您应该从过滤器链中删除您不需要的那些。

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

    //Traditional chain
    [
        pattern: '/**',
        filters: 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'
    ]
]

【讨论】:

谢谢,通过这种方法,我已经能够避免身份验证需要会话,即在我设置了令牌且没有会话的情况下,我不再被重定向回登录页面。但是,尽管我有一个自定义的 LoginController 和视图,但仍然坚持创建会话然后我被重定向到登录页面。有什么想法可以做到吗? 不。但是把spring security日志的级别设置为debug,说不定对你有帮助。【参考方案2】:

看来您至少需要将以下 Spring Security 属性设置为 false 才能正确禁用会话创建。

application.groovy

grails.plugin.springsecurity.scr.allowSessionCreation = false
grails.plugin.springsecurity.scpf.forceEagerSessionCreation = false
grails.plugin.springsecurity.apf.allowSessionCreation = false

您可以在 Grails Spring Security 插件documentation website 中获得更多信息。

【讨论】:

以上是关于如何防止 Grails 3 创建会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 grails 中使用会话

具有并发会话的 grails 3

部署到 Tomcat 时,Grails 3 会话超时不起作用

在 grails 中,我如何获得对所有当前会话的引用?

Grails 在服务类中获取会话和管理

Grails下如何防止异常导致事务回滚?