spring-security Spring Keycloak身份验证-同时服务于Web应用程序和Web服务

iezvtpos  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(160)

我们的堆栈包括以下服务,每个服务都在一个Docker容器中运行:

  • React中的前端
  • 基于Sping Boot 的后端服务“资源-服务”
  • 钥匙罩
  • 其他后端服务(使用者)

前端和消费者服务都使用REST API与后端通信。我们使用Keycloak作为我们的用户管理和身份验证服务。
我们希望通过为Web应用程序和服务流提供服务,将我们基于Spring的服务“resource-service”与Keycloak集成:

  1. Web应用-基于React的前端发送,其应当从“resource-service”获得重定向302,并发送用户/浏览器以登录到Keycloak站点,然后返回以获得所请求的资源。
    1.服务器2服务器通信-需要使用“资源服务”API的服务器在出现身份验证问题时应该获得401,而不是重定向/登录页面。
    将Spring与Keycloak集成有几个选项:
  2. Keycloak Spring Boot 适配器
  3. Keycloak Spring安全适配器
  4. Spring安全性和OAuth2
    我注意到在Keycloak文档中有一个“autodetect-bearer-only”,它似乎完全支持这种情况。但是-有很多集成选项,我不确定对于一个新的Sping Boot 服务来说,什么是最好的方法。另外,我没有找到在哪里配置该属性。
vx6bjr1n

vx6bjr1n1#

我已经使用了方法一和方法二,在我看来,如果您正在使用Sping Boot ,请使用相应的适配器,如果您仍在使用普通的Spring MVC,请使用Spring Security适配器。我从来没有看到第三种方法的必要性,因为您基本上必须自己完成所有事情,为什么没有人使用前两种方法呢?
至于使用Spring Bood适配器,唯一需要的配置如下:

keycloak:
  bearer-only: true
  auth-server-url: your-url
  realm: your-realm
  resource: your-resource

这样就完成了。bearer-only是这样的,如果客户端没有使用bearer-token,并且没有按照您的要求被重定向到登录页面,您将返回401。至少这对我们来说是有效的:-)
之后,您可以使用配置来保护端点,但使用httpSecurity或@EnableGlobalMethodSecurity会更灵活一些,例如,我们使用@Secured({“ROLE_whatever_role”})。
如果您使用的是结合了Spring Cloud的最新Sping Boot 版本,则可能会遇到this issue

wmvff8tz

wmvff8tz2#

我将资源服务器配置为当Authorization头丢失或无效时总是返回401(而从不返回302),无论客户端是什么。
客户端在需要时处理身份验证、令牌刷新等:一些certified OpenID client libs甚至提出了这样的特性,即在向受保护的资源发出请求之前,确保用户拥有有效的访问令牌。
Spring are now deprecated的Keycloak适配器。您可以参考this tutorials了解各种资源服务器安全配置选项。它涵盖了从最简单的RBAC到构建DSL的用例,如:@PreAuthorize("is(#username) or isNice() or onBehalfOf(#username).can('greet')")

相关问题