使用Spring Security使用自定义无状态身份验证机制保护URL

时间:2017-08-21 13:21:18

标签: java spring authentication spring-security

我有一个Spring REST应用程序,通过Spring Boot在嵌入式Tomcat上运行。我有各种带有注释@RestController的类,其方法是REST端点。我有Springfox Swagger,它在URL /v2/api-docs下生成Open API Specification JSON。一切正常。

现在我想使用以下身份验证机制保护/v2/api-docs

  • 用户在Username HTTP标头中提供用户名,在Password-Utf8-Base64标头中提供密码(这是所提供密码的UTF-8编码的base64编码)。
  • 后端方法(已存在)检查用户名/密码,并检查他们是否有权查看此URL。
  • 应该没有会话,每次通话都应提供标题,每次通话都要进行授权检查。
  • 如果验证信息不正确,则应向客户端提供401或403错误。如果用户名/密码错误,则为401;如果是正确的,则为403,但是他们无权访问该URL。不应该重定向到HTML登录页面等,因为这只是一个REST应用程序。

我在想,Spring Security是正确的方法吗?因为有了它,我应该能够在不改变提供/v2/api-docs端点的Springfox代码的情况下指定该端点应该通过上述认证机制是安全的。

我知道从哪里开始我有点失落。 Spring Security's Getting Started Guide描述了在登录错误的情况下如何重定向到登录页面。我想我可以通过执行身份验证的自己UserDetails创建但是如何访问HTTP标头以查找提供的用户名/密码?如何发送401 vs 403状态代码?

1 个答案:

答案 0 :(得分:1)

听起来您需要REST的基本身份验证(请参阅the example)。

令牌传递的唯一区别。而不是2个头,解决方案需要一个像这样定义的

String plainClientCredentials="myusername:mypassword";
String base64ClientCredentials = new String(Base64.encodeBase64(plainClientCredentials.getBytes()));

HttpHeaders headers = getHeaders();
headers.add("Authorization", "Basic " + base64ClientCredentials);