Spring Security:外部认证和内部认证

时间:2018-12-10 16:49:44

标签: java spring spring-boot spring-security spring-rest

我有一个REST服务,该服务依赖于外部系统来对令牌进行身份验证,但需要自己进行授权(使用@Secured之类的API级访问权限)。

要求:

  1. UI使用外部系统生成令牌。
  2. UI使用令牌向我的服务进行REST调用。
  3. 我的服务使用外部系统验证令牌,但API调用的身份验证由我的服务完成

一种可能的解决方案是使用过滤器执行此操作:

  1. UI使用外部系统生成令牌。
  2. UI使用令牌向我的服务进行REST调用。
  3. 我的服务具有一个过滤器,该过滤器使用令牌调用外部系统。
  4. 有效令牌的外部系统会发回用户详细信息。
  5. 成功调用集上的服务就像SecurityContextHolder一样

    SecurityContextHolder.getContext()。setAuthentication(new AuthorizedUser(“ test”,Arrays.asList(new SimpleGrantedAuthority(“ test_role”)),“ test”,null));

还有其他方法可以实现吗?

1 个答案:

答案 0 :(得分:0)

如果您正在寻找有关体系结构的建议,则可以通过更改第一步和其他步骤来节省对“外部系统”的额外调用:

  1. UI使用外部系统生成令牌。

    1.1。外部系统将用户详细信息保存在内存中的键值数据库(例如Redis)中。

...

  1. 我的服务具有一个过滤器,该过滤器使用令牌从Redis获取用户详细信息。

如果您想保护“外部系统”免受来自过滤器的多次调用的骚扰,那就很有意义。

如果您正在寻找实现提示,那么对您的代码验证身份验证和完成授权后,请致电SecurityContextHolder.getContext().setAuthentication()

使用@javax.annotation.security.RolesAllowed代替@Secured也许是一个更好的主意(工作方式相同,但名称更明显)。

有时您可能希望使用org.springframework.http.client.ClientHttpRequestInterceptor而不是过滤器,例如:Difference between Interceptor and Filter in Spring MVC