Spring Security 令牌身份验证 - RESTful JSON 服务

2024-03-21

我希望将 Spring Security 用于 Spring MVC 应用程序,该应用程序严格来说是一个 JSON Web 服务。我做了一些研究并阅读了一些文章,但还没有真正找到完整的内容。我希望应用程序完全无状态并使用基于令牌的身份验证。我不希望 Spring MVC 应用程序有任何表单,或使用表单进行身份验证。它应该严格接受 JSON 格式的请求和数据,并返回 JSON 响应。

将有一个 Angular JS 客户端应用程序,需要发送用户名和密码,并从应用程序获取令牌以在顺序请求中使用。在某些时候,可能会有 Android 客户端也访问此 Web 服务。

我假设 Spring Security 在内部有自己的方式将令牌映射到用户会话,这意味着它知道令牌 XXXXXXXXXXXX 是管理员用户 Bob,令牌 AAAAAAAAAA 是标准用户 Joe。然而,我对 Spring Security 没有太多经验,所以我不知道这一切是如何结合在一起的。我仍然希望能够在控制器和服务方法上使用安全注释。

Spring Security 有没有办法实现这一点?

这个问题似乎是一个很好的起点,但我不确定这是否会像我想象的那样起作用通过 Spring 进行 RESTful 身份验证 https://stackoverflow.com/questions/10826293/restful-authentication-via-spring.


这将是一个很好的起点弹簧支撑样板 https://github.com/dhavaln/spring-rest-boilerplate.

  1. 第一次你必须使用http基本身份验证并且 然后登录(发送用户名/密码),这将返回令牌。
  2. 在后续请求中,您将使用此令牌进行身份验证。
  3. 您必须在链中添加一个过滤器来执行此操作 基于令牌的身份验证。

您必须想出一种令牌格式和加密方式。理想情况下,您还需要保留令牌的到期日,到期日和用户名可能是令牌的一部分。使用加密算法加密哈希函数(例如MD5)并获取整个令牌的哈希值。

Edit: 正如所指出的马切伊·斯泰皮拉MD5 似乎已被破坏,建议使用更强的哈希函数,如 SHA-256。

默认情况下,Spring security 会将您重定向到登录页面,但这在 REST 情况下没有意义,因此请使用自定义AuthenticationEntryPoint在配置中(参考示例 github 代码)。

我使用这种格式作为我的令牌:token:username:hash:expiry

哈希=MD5(用户名+magickey)

到期=当前_时间戳+分钟_到_到期

 <security:http realm="Protected API" use-expressions="true" auto-config="false" create-session="always" entry-point-ref="**CustomAuthenticationEntryPoint**">
        <security:custom-filter ref="**authenticationTokenProcessingFilter**" position="PRE_AUTH_FILTER" />
        <security:intercept-url pattern="/**" access="isAuthenticated()" />
 </security:http>

注意:谢谢dhavaln对于代码。我以此为参考并开发了类似的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security 令牌身份验证 - RESTful JSON 服务 的相关文章

随机推荐