Spring Security 3.2令牌认证

6

我知道这个问题已经被问过了,但是我无法让它工作。

这是我想要完成的事情:

我正在使用Spring Security 3.2来保护REST风格的服务。没有服务器端会话。

我没有使用基本身份验证,因为这意味着我需要在客户端cookie中存储用户的密码。否则,用户需要在每次页面刷新/更改时登录。存储令牌可能是较小的恶。

  1. Web客户端(浏览器、移动应用程序)使用用户名和密码调用类似REST的URL来登录“/login”
  2. 服务器对用户进行身份验证并向客户端发送一个令牌
  3. 客户端存储该令牌,并在每次api调用时将其添加到http请求标头中
  4. 服务器检查令牌的有效性,并相应地发送响应

我甚至还没有看过令牌生成部分。我知道这是反向的,但我想先实现令牌验证部分。

我试图通过使用自定义过滤器(AbstractAuthenticationProcessingFilter的实现)来实现这一目标,但是我似乎有错误的想法。

像这样定义它:

public TokenAuthenticationFilter() {
    super("/");
}

仅会针对此确切URL触发过滤器。 我正在遵循一些示例实现,其中调用AbstractAuthenticationProcessingFilter#requiresAuthentication,它不接受通配符。 当然,我可以改变这种行为,但这让我觉得我走错了路。

我还开始实现自定义的AuthenticationProvider。也许那是正确的事情? 有人能给我一个正确的方向吗?


1
我试图做完全相同的事情...你在Spring Security方面成功了吗?你能详细说明一下你的解决方案吗? - fvisticot
你找到解决方案了吗? - sinujohn
1个回答

1
我认为预授权过滤器更适合您的场景。重写AbstractPreAuthenticatedProcessingFilter的getPrincipal和getCredentials方法。如果标头中不存在令牌,则从getPrincipal返回null。
流程:
用户首次登录时,未传递标头,因此在securityContext中未设置身份验证对象,正常身份验证过程将按照以下方式进行:ExceptionTranslation过滤器基于表单登录过滤器或自定义authenticationEntryPoint将用户重定向到/login页面。
成功身份验证后,用户请求受保护的网址,预授权过滤器从标头获取令牌,在securityContext中设置身份验证对象,如果用户具有访问权限,则允许他访问受保护的网址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接