我有一个REST服务,该服务依赖于外部系统来对令牌进行身份验证,但需要自己进行授权(使用@Secured之类的API级访问权限)。
要求:
一种可能的解决方案是使用过滤器执行此操作:
成功调用集上的服务就像SecurityContextHolder一样
SecurityContextHolder.getContext()。setAuthentication(new AuthorizedUser(“ test”,Arrays.asList(new SimpleGrantedAuthority(“ test_role”)),“ test”,null));
还有其他方法可以实现吗?
答案 0 :(得分:0)
如果您正在寻找有关体系结构的建议,则可以通过更改第一步和其他步骤来节省对“外部系统”的额外调用:
UI使用外部系统生成令牌。
1.1。外部系统将用户详细信息保存在内存中的键值数据库(例如Redis)中。
...
如果您想保护“外部系统”免受来自过滤器的多次调用的骚扰,那就很有意义。
如果您正在寻找实现提示,那么对您的代码验证身份验证和完成授权后,请致电SecurityContextHolder.getContext().setAuthentication()
。
使用@javax.annotation.security.RolesAllowed
代替@Secured
也许是一个更好的主意(工作方式相同,但名称更明显)。
有时您可能希望使用org.springframework.http.client.ClientHttpRequestInterceptor
而不是过滤器,例如:Difference between Interceptor and Filter in Spring MVC