Spring Security令牌认证 - RESTful JSON服务

gre*_*fox 23 restful-authentication spring-mvc spring-security

我希望将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身份验证.

M4v*_*r1k 18

这将是一个从Spring-Rest-Boilerplate开始的好地方.

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

你必须为它提出一种令牌格式和加密.理想情况下,您也需要保持令牌的到期,到期以及用户名可能是令牌的一部分.使用加密算法加密哈希函数(如MD5)并获取整个令牌的哈希值.

编辑:正如MaciejStępyra指出的那样,MD5似乎已被打破,并建议使用强大的散列函数,如SHA-256.

默认情况下,Spring安全性会将您重定向到登录页面,但这在REST的情况下没有意义,因此AuthenticationEntryPoint在配置中使用自定义(Ref sample github code).

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

散列= MD5(用户名+ magickey)

期满= CURRENT_TIMESTAMP + mins_to_expiry

 <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>
Run Code Online (Sandbox Code Playgroud)

注意:感谢dhavaln代码.我用它作为参考并开发了类似的东西.