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 保护前端和 REST API

NodeJS + Keycloak 没有快递

在使用 Keycloak 保护的 web 应用程序中获取登录用户名

Keycloak - spring boot - 外部登录网页

keycloak,用户注册。如何添加角色?