我们的堆栈包括以下服务,每个服务都在一个Docker容器中运行:
- React中的前端
- 基于Sping Boot 的后端服务“资源-服务”
- 钥匙罩
- 其他后端服务(使用者)
前端和消费者服务都使用REST API与后端通信。我们使用Keycloak作为我们的用户管理和身份验证服务。
我们希望通过为Web应用程序和服务流提供服务,将我们基于Spring的服务“resource-service”与Keycloak集成:
- Web应用-基于React的前端发送,其应当从“resource-service”获得重定向302,并发送用户/浏览器以登录到Keycloak站点,然后返回以获得所请求的资源。
1.服务器2服务器通信-需要使用“资源服务”API的服务器在出现身份验证问题时应该获得401,而不是重定向/登录页面。
将Spring与Keycloak集成有几个选项: - Keycloak Spring Boot 适配器
- Keycloak Spring安全适配器
- Spring安全性和OAuth2
我注意到在Keycloak文档中有一个“autodetect-bearer-only”,它似乎完全支持这种情况。但是-有很多集成选项,我不确定对于一个新的Sping Boot 服务来说,什么是最好的方法。另外,我没有找到在哪里配置该属性。
2条答案
按热度按时间vx6bjr1n1#
我已经使用了方法一和方法二,在我看来,如果您正在使用Sping Boot ,请使用相应的适配器,如果您仍在使用普通的Spring MVC,请使用Spring Security适配器。我从来没有看到第三种方法的必要性,因为您基本上必须自己完成所有事情,为什么没有人使用前两种方法呢?
至于使用Spring Bood适配器,唯一需要的配置如下:
这样就完成了。bearer-only是这样的,如果客户端没有使用bearer-token,并且没有按照您的要求被重定向到登录页面,您将返回401。至少这对我们来说是有效的:-)
之后,您可以使用配置来保护端点,但使用httpSecurity或@EnableGlobalMethodSecurity会更灵活一些,例如,我们使用@Secured({“ROLE_whatever_role”})。
如果您使用的是结合了Spring Cloud的最新Sping Boot 版本,则可能会遇到this issue。
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')")
个