我知道保护 REST API 是一个被广泛评论的话题,但我无法创建满足我的标准的小型原型(我需要确认这些标准是否切合实际)。如何保护资源以及如何使用 Spring 安全性有很多选择,我需要澄清我的需求是否切合实际。
我的要求
- 基于令牌的身份验证器 - 用户将提供其凭据并获得唯一且有时间限制的访问令牌。我想在我自己的实现中管理令牌创建、检查有效性和到期时间。
- 一些 REST 资源将是公开的——根本不需要身份验证,
- 某些资源仅供具有管理员权限的用户访问,
- 其他资源将在所有用户授权后访问。
- 我不想使用基本身份验证
- Java 代码配置(非 XML)
当前状态
我的 REST API 运行良好,但现在我需要保护它。当我在寻找解决方案时,我创建了一个 javax.servlet.Filter
过滤器:
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String accessToken = request.getHeader(AUTHORIZATION_TOKEN);
Account account = accountDao.find(accessToken);
if (account == null) {
throw new UnauthorizedException();
}
chain.doFilter(req, res);
}
但是这个解决方案 javax.servlet.filters
不能按我的需要工作,因为通过 @ControllerAdvice
使用 Spring servlet dispatcher
我需要的
我想知道这些标准是否切合实际并获得任何帮助,如何开始使用 Spring Security 保护 REST API。我阅读了许多教程(例如 Spring Data REST + Spring Security ),但所有教程都在非常基本的配置中工作——用户 及其凭据存储 在配置中的内存中,我需要使用 DBMS 并创建自己的身份验证器。
请给我一些如何开始的想法。
原文由 Artegon 发布,翻译遵循 CC BY-SA 4.0 许可协议
实际上,对令牌 Auth 使用过滤器 - 在这种情况下最好的方法
最终,您可以通过 Spring Data 创建 CRUD 来管理 Token 的属性,如过期等。
这是我的令牌过滤器:http: //pastebin.com/13WWpLq2
和令牌服务实现
http://pastebin.com/dUYM555E
这不是问题,您可以像这样通过 Spring 安全配置管理您的资源:
.antMatchers("/rest/blabla/**").permitAll()
看看
@Secured
类注释。例子:回到 Spring Security 配置,你可以这样配置你的 url:
是的,通过令牌过滤器,您的用户将通过身份验证。
回到上面的话,看
@EnableWebSecurity
。你的班级将是:您必须重写 配置 方法。下面的代码,仅作为示例,如何配置匹配器。它来自另一个项目。