Spring Security 3.2令牌认证

atl*_*lan 6 java authentication rest token spring-security

我知道这已经被问到了,但是我无法让它发挥作用.以下是我想要完成的事情:

我使用Spring Security 3.2来保护类似REST的服务.没有服务器端会话.我没有使用基本身份验证,因为这意味着我需要将用户密码存储在客户端的cookie中.否则,用户需要在每次刷新/更改页面时登录.存储令牌是我猜的较小的邪恶.

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

我甚至没有看过令牌生成部分.我知道它是倒退的,但我想首先实现令牌验证部分.

我试图通过使用自定义文件管理器(AbstractAuthenticationProcessingFilter的实现)来实现这一点,但我似乎对它有错误的想法.

像这样定义:

public TokenAuthenticationFilter() {
    super("/");
}
Run Code Online (Sandbox Code Playgroud)

只会触发此精确网址的过滤器.我坚持一些示例实现,它调用AbstractAuthenticationProcessingFilter#requiresAuthentication,它不接受通配符.我当然可以改变这种行为,但这让我觉得我走错了路.

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

cod*_*der 1

我认为预身份验证过滤器更适合您的场景。重写 AbstractPreAuthenticatedProcessingFilter 的 getPrincipal 和 getCredentials 方法。如果标头中不存在令牌,则从 getPrincipal 返回 null。

流动:

  • 用户首次登录,没有传递标头,因此在 securityContext 中没有设置身份验证对象,接下来是正常的身份验证过程,即 ExceptionTranslation 过滤器根据表单登录过滤器或您的自定义authenticationEntryPoint 将用户重定向到 /login 页面
  • 身份验证成功后,用户请求安全 url,预身份验证过滤器从 securityContext 中设置的标头身份验证对象获取令牌,如果用户具有访问权限,则允许访问安全 url