代码之家  ›  专栏  ›  技术社区  ›  JDev

spring安全:外部认证和内部认证

  •  0
  • JDev  · 技术社区  · 6 年前

    我有一个rest服务,它依赖于一个外部系统来验证令牌,但是需要自己进行授权(api级别的访问使用like@secured)。

    要求:

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

    一种可能的解决方案是使用过滤器:

    1. ui使用外部系统生成令牌。
    2. ui使用指向我的服务的令牌进行rest调用。
    3. 我的服务有一个用令牌调用外部系统的过滤器。
    4. 有效令牌的外部系统发回用户详细信息。
    5. 我对成功呼叫集的服务是SecurityContextHolder

      securityContextHolder.getContext().setAuthentication(新建 authorizedUser(“测试”,arrays.aslist(新建 简单授权(“测试角色”),“测试”,空);

    有没有其他方法可以实现这一点?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Nikita Tukkel    6 年前

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

    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