java - Spring Security:外部认证和内部认证
问题描述
我有一个 REST 服务,它依赖于外部系统来验证令牌,但需要自己进行授权(使用 @Secured 之类的 API 级别访问)。
要求:
- UI 使用外部系统生成令牌。
- UI 使用令牌对我的服务进行 REST 调用。
- 我的服务使用外部系统验证令牌,但 API 调用的身份验证由我的服务完成
一种可能的解决方案是使用过滤器来做到这一点:
- UI 使用外部系统生成令牌。
- UI 使用令牌对我的服务进行 REST 调用。
- 我的服务有一个过滤器,它使用令牌调用外部系统。
- 有效令牌的外部系统发回用户详细信息。
我在成功调用集上的服务是 SecurityContextHolder 之类的
SecurityContextHolder.getContext().setAuthentication(new AuthorizedUser("test", Arrays.asList(new SimpleGrantedAuthority("test_role")), "test",null));
有没有其他方法可以实现?
解决方案
如果您正在寻找有关您的架构的建议,那么您可以通过更改第一步和其他步骤来节省对“外部系统”的额外调用:
UI 使用外部系统生成令牌。
1.1。外部系统将用户详细信息保存在一些内存键值数据库(如 Redis)中。
...
- 我的服务有一个过滤器,它使用令牌从 Redis 获取用户详细信息。
如果您想保护“外部系统”免受来自过滤器的多次调用的垃圾邮件,这是有道理的。
如果您正在寻找实现提示,那么SecurityContextHolder.getContext().setAuthentication()
在您的代码验证身份验证和完成授权时调用对我来说似乎很好。
也许使用@javax.annotation.security.RolesAllowed
而不是更好的主意@Secured
(工作方式相同,但名称更明显)。
有时您可能喜欢使用org.springframework.http.client.ClientHttpRequestInterceptor
过滤器而不是过滤器,例如:Difference between Interceptor and Filter in Spring MVC
推荐阅读
- python - Python 抛出 AttributeError:'Group' 对象没有属性 'blitme'
- python - 解决 Python 之谜
- symfony - Symfony 自动装配事件监听器
- java - 为什么我不能在 j_spring_security_check 页面上创建“链接”?
- django - 用聚合连接 DJANGO 中的两个表
- c# - 关于单元测试的问题
- reactjs - socket.io 反应 heroku 405
- python - 在Python中将具有重复键的嵌套JSON文件转换为数据框
- javascript - 加载/卸载 HTML5 时还存在 iOS Safari 内存泄漏
- swift - Swift DispatchQueue concurrentPerform OpenGL 并行渲染