Spring Security:外部认证和内部认证
Posted
技术标签:
【中文标题】Spring Security:外部认证和内部认证【英文标题】:Spring Security: External authentication and internal authentication 【发布时间】:2019-05-11 14:46:04 【问题描述】:我有一个 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));
还有其他方法可以实现吗?
【问题讨论】:
您是否尝试使用 facebook 或 google auth 之类的东西? @uğurtaş Nops。这只是另一个微服务。 【参考方案1】:如果您正在寻找有关您的架构的建议,那么您可以通过更改第一步和其他步骤来节省对“外部系统”的额外调用:
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
【讨论】:
@JDev 我的回答对您有用吗?以上是关于Spring Security:外部认证和内部认证的主要内容,如果未能解决你的问题,请参考以下文章
spring security + Oauth2 内部2个子系统认证用户和管理员权限分离
Springboot和Spring Security中认证成功后如何授权Rest API调用
Spring Security 3.0:认证后的 GET 请求