Keycloak,如何保护不提供网页的 Spring Boot 后端?
Posted
技术标签:
【中文标题】Keycloak,如何保护不提供网页的 Spring Boot 后端?【英文标题】:Keycloak, How to secure spring boot back end that doesn't serve web pages? 【发布时间】:2020-05-09 05:37:27 【问题描述】:我有一个前端,通过让我们的登录页面向 Keycloak 服务器发出 POST 请求,我使用 keycloak 保护了它,因此我可以获得访问令牌 (JWT)。我们不使用 kecloak 提供的登录页面。此前端对后端(spring-boot)servlet 进行 REST 调用,该 servlet 使用这些调用来查询数据库并将数据发送回前端。我看到的大多数关于保护 spring-boot 应用程序的教程都使用 spring-boot 来提供网页,并使用默认的 keycloak 登录页面。我的问题是,如何在不使用 keycloak 登录页面的情况下使用 keycloak spring-boot 适配器?有什么方法可以在每个请求中传递 keycloak 访问令牌,相当于 keycloak 的预期方式吗?
我正在使用 keycloak 7.0.0 版并按角色保护每个端点。
我已尽我所能遵循本教程, 除了我的 @Controller 使用不同并且不使用任何 spring-boot 模型对象来服务网页,如前所述。目前每个请求都会返回 500 错误。所以这让我想到了这个问题。 https://www.thomasvitale.com/spring-boot-keycloak-security/
谢谢!
【问题讨论】:
【参考方案1】:这个问题非常广泛,不适合 ***,但最后 *** 的平台可以互相帮助,所以这里有一个解决方案。
在你的 rest api 项目中创建一个 Keycloak 功能类,它将验证所有来获取数据的请求。
让我们看一个案例,假设我想在 Keycloak 以及我的数据库中创建一个角色,我必须做什么?
假设请求将来自 Rest 客户端或 GUI -> 请求应包含令牌,因此每个请求都有一个有效令牌,因此您在 Keycloak DB 中创建角色的代码将是这样的
public void createRole(String createRoleAPIurl,String accessToken)
RoleRepresentation roleRepresentation = new RoleRepresentation();
roleRepresentation.setName(role.getRoleName());
roleRepresentation.setDescription(role.getDescription());
String convertValue = mapper.writeValueAsString(roleRepresentation);
StringEntity entity = new StringEntity(convertValue);
response = keycloakUtil.fetchURLResponse(createRoleAPIurl, accessToken, entity);
和
public CloseableHttpResponse fetchURLResponse(String createRoleAPIurl, String accessToken, StringEntity entity)
throws IOException, ClientProtocolException
CloseableHttpResponse response = null;
try
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost postRequest = new HttpPost(url);
postRequest.addHeader("Authorization", "bearer " + accessToken);
postRequest.addHeader("content-type", "application/json");
postRequest.setEntity(entity);
response = httpclient.execute(postRequest);
catch (Exception e)
return response;
在此示例中,查询将转到 Keycloak,因此 url 将类似于 https://<PORT>:<IP>/auth/roles
这个 url,例如,在您的情况下,您必须编写另一个方法来验证令牌,如果令牌将被验证,那么只有您将允许请求从您的数据库中获取数据,否则您可以抛出一些异常或传递消息。所以你的每个请求都应该带有一个有效的令牌,现在它有责任验证令牌,然后只允许访问你的资源。
希望对你有所帮助。
【讨论】:
以上是关于Keycloak,如何保护不提供网页的 Spring Boot 后端?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Keycloak 保护 Angular 8 前端和使用网关、eureka 的 Java Spring Cloud 微服务后端
在使用 Keycloak 保护的 web 应用程序中获取登录用户名