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。也许这是正确的?有人可以推动我朝着正确的方向前进吗?

4

1 回答 1

1

我认为预授权过滤器更适合您的场景。覆盖 AbstractPreAuthenticatedProcessingFilter 的 getPrincipal 和 getCredentials 方法。如果标头中不存在令牌,则从 getPrincipal 返回 null。

流动:

  • 用户第一次登录,没有通过header,所以securityContext中没有设置身份验证对象,正常的身份验证过程如下,即ExceptionTranslation过滤器根据form-logon过滤器或您的自定义authenticationEntryPoint将用户重定向到/login页面
  • 身份验证成功后,用户请求安全 url,pre-auth 过滤器从 securityContext 中设置的标头身份验证对象获取令牌,如果用户有权访问,则允许他访问安全 url
于 2013-08-09T09:38:47.303 回答