Grails 3 和 Spring Security:当用户未登录时返回 401

Posted

技术标签:

【中文标题】Grails 3 和 Spring Security:当用户未登录时返回 401【英文标题】:Grails 3 and Spring Security: return 401 when user is not logged in 【发布时间】:2017-11-02 21:03:12 【问题描述】:

在我的 Grails 3.2.9 网络应用程序中,我使用 Spring Security 插件来管理用户会话。这是依赖:

compile "org.grails.plugins:spring-security-core:3.1.1"

应用程序的自然(多年)演变带来了所有控制器中的基本所有操作,主要使用 @Secured 注释保护,以返回 JSON,类似于

return map as JSON    // grails.converters.JSON

这意味着所有操作基本上都像 API 一样。

但由于它们是安全的,当用户未登录时,会执行重定向到/login/auth(登录页面),这是您不会想到的。这就是为什么我正在寻找一种方法来返回 401 unauthorized 状态而不是让 Spring Security 执行重定向。

到目前为止,我已经查看了pessimistic lockdown,并且在网络上的搜索也将我带到了Spring Security Core REST plugin,但这两种方式似乎都不适合我的情况(最后对我来说,但也许我是遗漏了一些东西)。

所以欢迎任何建议,提前谢谢!

【问题讨论】:

【参考方案1】:

我没有使用 Grails 的经验,但也许您正在寻找的东西可以通过在 Spring 安全配置中提供 org.springframework.security.web.AuthenticationEntryPoint 的不同实现来实现。默认情况下,Spring 使用 org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint 进行表单身份验证,它执行重定向到给定的登录页面。另一方面,org.springframework.security.web.authentication.HttpStatusEntryPoint 只是返回所需的状态。

在我们的项目中,入口点是通过 XML 配置以老式方式设置的:

<http pattern="/**" auto-config="false" entry-point-ref="yourAuthenticationEntryPoint">

【讨论】:

【参考方案2】:

resources.groovy注册以下

authenticationEntryPoint(Http401AuthenticationEntryPoint, 'Bearer')

【讨论】:

这就像魔术一样! :D 我不可能得到这个解决方案。实际上,经过一些研究,我仍然有点模糊了解整个情况..您能否提供一个您认为最适合这种情况的参考?那真的很有帮助 请将答案标记为已接受。我没有参考。我查看了源代码的工作原理并做了适当的处理

以上是关于Grails 3 和 Spring Security:当用户未登录时返回 401的主要内容,如果未能解决你的问题,请参考以下文章

Spring 3.0 - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/securit

使用带有令牌的 spring 安全插件的一个好习惯

Grails 3.0 和 Spring Security

Grails 3 和 Spring Security:当用户未登录时返回 401

Grails 3 Spring Security 覆盖登录表单

Grails 1.3.5 和 Spring Security Core