iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Boot应用程序中如何使用Keycloak详解
  • 406
分享到

Spring Boot应用程序中如何使用Keycloak详解

Spring Boot使用KeycloakSpringBoot Keycloak 2023-05-20 06:05:02 406人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录正文什么是Keycloak?我们为什么要使用Keycloak?在Spring Boot 应用程序中使用keycloak安装Keycloak添加应用程序添加用户创建 spring

正文

在这篇文章中,我将展示如何在 Spring Boot 应用程序中使用 Keycloak。在我们使用 Keycloak 之前,我们将介绍一些关于 Keycloak 是什么以及我们为什么使用它的基础知识。

要开始前,您需要具备以下条件:

什么是Keycloak?

Keycloak是一种用于现代应用程序和服务的开源身份和访问管理解决方案。Keycloak 同时提供 SAML 和 OpenID 协议解决方案。

我们为什么要使用Keycloak?

如前所述,Keycloak 提供身份和访问管理,它也是开源的。SAML 和 OpenID 协议是行业标准。构建与 Keycloak 集成的应用程序只会为您提供更安全和稳定的解决方案。当然还有其他可用的解决方案,如 Gluu、Shibboleth、WSO2。

对于这篇文章,我们将使用 Keycloak。

在Spring Boot 应用程序中使用keycloak

这个演示有两个部分。一个是关于Keycloak。第二个是关于使用 Keycloak 保护 Spring Boot 应用程序。

安装Keycloak

在您的机器上下载Keycloak 。解压缩下载的文件并使用命令提示符下 bin 目录中的以下命令运行服务器(注意 – 我在 windows 机器上):

standalone.bat -Djboss.Socket.binding.port-offset=100

这将在本地计算机上为您的 Keycloak 启动 Wildfly 服务器。我们可以通过执行 URL 来访问服务器Http://localhost:8180。如果您只是使用 standalone.bat 执行而没有该参数,则服务器将在端口上运行8080

启动服务器后,您要做的第一件事就是创建一个管理员用户。我们将创建一个用户 admin 和密码 d#n3q2b 。

现在我们将访问管理控制台并输入我们的用户详细信息。一旦我们以管理员用户身份登录,我们将看到如下第一个屏幕:

添加应用程序

初始屏幕显示默认领域。出于演示目的,我们将创建一个新领域SpringBootKeycloakApp。在这个领域中,我们将添加我们的 Spring Boot 应用程序作为客户端。在“客户端”选项卡上创建一个新客户端。我们将我们的客户端应用程序命名为 SpringBootApp。

现在在设置中,我们将为我们的 Spring Boot 应用程序添加重定向 url。这是 Keycloak 将在身份验证后重定向到我们的应用程序的 URL。此外,我们使用 openid connect 作为协议作为此实现的一部分。

添加用户

现在我们将添加一个我们将用于身份验证的用户。我们将使用此用户登录到我们的示例 Spring Boot 应用程序。

在 Keycloak 的角色选项卡上为该用户添加您想要的角色ROLE_User。完成后,让我们转到“用户”选项卡并添加一个新用户。

在 Role Mappings 选项卡上,确保为该用户添加新创建的角色。

创建 Spring Boot 应用程序

现在,我们将创建一个简单的 Spring Boot 应用程序,它将使用 Keycloak 来确保安全。作为此应用程序的一部分,我们将为将通过应用程序进行身份验证的用户显示待办事项列表任务。

要构建此应用程序,我们需要以下依赖项:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-WEB'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.keycloak:keycloak-spring-boot-starter'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    testImplementation 'org.springframework.security:spring-security-test'
}

如您所见,我们正在使用spring-bootandspring-security以及keycloak-spring-boot-starter依赖项。

keycloak 依赖项包括 Keycloak 客户端适配器。我们将使用这些适配器进行身份验证。它们将取代我们的标准 Spring Security 适配器。为了确保此keycloak-spring-boot-starter依赖项正常工作,我们需要在我们的 gradle 文件中添加一个依赖项,如下所示:

dependencyManagement {
    imports {
        MavenBom "org.keycloak.bom:keycloak-adapter-bom:11.0.2"
    }
}

要了解更多相关信息,您可以访问keycloak的官方文档。

我们的 Controller 类将有两个重要的方法,一个是获取任何人都可以访问的主页,另一个是获取任务列表,只有具有 ROLE_User 角色的经过身份验证的用户才能访问这些任务。此 TaskController 的代码如下所示:

package com.betterjavacode.keycloakdemo.keycloakdemo.controllers;
import com.betterjavacode.keycloakdemo.keycloakdemo.dto.TaskDto;
import com.betterjavacode.keycloakdemo.keycloakdemo.managers.TaskManager;
import org.keycloak.KeycloakSecurityContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.httpservletRequest;
import java.util.List;
@Controller
public class TaskController
{
    private final HttpServletRequest request;
    @Autowired
    public TaskController(HttpServletRequest request)
    {
        this.request = request;
    }
    @Autowired
    private TaskManager taskManager;
    @GetMapping(value="/")
    public String home()
    {
        return "index";
    }
    @GetMapping(value="/tasks")
    public String getTasks(Model model)
    {
        List tasks = taskManager.getAllTasks();
        model.addAttribute("tasks", tasks);
        model.addAttribute("name", geTKEycloakSecurityContext().getIdToken().getGivenName());
        return "tasks";
    }
    private KeycloakSecurityContext getKeycloakSecurityContext()
    {
        return (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
    }
}

在这个控制器类中,我们用来TaskManager获取所有任务。我会解释 KeyCloakSecurityContext我什么时候会展示SecurityConfig

有没有使用Spring-Security

我们可以利用此应用程序并使用 Keycloak 进行身份验证,无论是否使用Spring-Security. 作为本演示的一部分,我们使用Spring-Security. 要在没有 Spring-Security 的情况下使用相同的应用程序,您只需删除 Spring-Security 依赖并通过application.properties文件添加安全配置。

我们需要以下属性才能application.properties在此应用程序中使用 Keycloak 进行身份验证。

keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloakApp
keycloak.resource=SpringBootApp
keycloak.public-client=true
keycloak.principal-attribute=preferred_username

如果我们想在没有 Spring-Security 的情况下使用这个应用程序,我们还需要以下两个属性:

keycloak.security-constraints[0].authRoles[0]=ROLE_User
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/tasks

由于我们正在使用Spring-Security,所以我们将通过一个 Java 类来配置安全配置SecurityConfig

这个 SecurityConfig 类将扩展KeyCloakWebSecurityConfigurerAdapter.

我们的配置方法如下所示:

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception
    {
        super.configure(httpSecurity);
        httpSecurity.authorizeRequests()
                .antMatchers("/tasks").hasRole("User")
                .anyRequest().permitAll();
    }

基本上任何到达 /tasks 端点的请求都应该具有 ROLE_User 用户角色。此处假定 ROLE_ 的前缀。除任何其他请求外,未经任何授权将被允许。在这种情况下,我们将调用我们的索引页面。

我们将使用@KeyCloakConfiguration基本上是封面@Configuration@EnableWebSecurity注释的注释。

由于我们的SecurityConfigextends KeycloakWebSecurityConfigurerAdapter,我们必须实施 sessionAuthenticationStrategy 和 httpSessionManager 。我们还必须使用 Spring Security Authentication Manager 注册我们的 idp Keycloak。

所以我们的 SecurityConfig 将如下所示:

package com.betterjavacode.keycloakdemo.keycloakdemo.config;
import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
import org.keycloak.adapters.springsecurity.management.HttpSessionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
import org.springframework.security.core.session.SessionReGIStryImpl;
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter
{
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder authenticationManagerBuilder)
    {
        SimpleAuthorityMapper simpleAuthorityMapper = new SimpleAuthorityMapper();
        simpleAuthorityMapper.setPrefix("ROLE_");
        KeycloakAuthenticationProvider keycloakAuthenticationProvider =
                keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(simpleAuthorityMapper);
        authenticationManagerBuilder.authenticationProvider(keycloakAuthenticationProvider);
    }
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy ()
    {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }
    @Bean
    @Override
    @ConditionalOnMissingBean(HttpSessionManager.class)
    protected HttpSessionManager httpSessionManager()
    {
        return new HttpSessionManager();
    }
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception
    {
        super.configure(httpSecurity);
        httpSecurity.authorizeRequests()
                .antMatchers("/tasks").hasRole("User")
                .anyRequest().permitAll();
    }
}

所以 Spring Security 使用像 ROLE_USER 这样大写的角色,并且总是使用 ROLE_ 前缀。为了处理这个问题,我在 Keycloak 中添加了一个角色为 ROLE_User 的用户,但我们只会验证一个前缀,因为我们的 http 配置无论如何都会验证该角色。

由于我们将使用 Keycloak 进行身份验证,因此我们需要一个用于用户状态的会话。我们在这里使用RegisterSessionAuthenticationStrategyHttpSessionManager是一个条件 bean,因为 Keycloak 已经实现了那个 bean。

要实现 Keycloak Spring Boot 适配器,我们将添加一个KeyCloakSpringBootConfigResolverbean,如下所示:

package com.betterjavacode.keycloakdemo.keycloakdemo.config;
import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class KeycloakConfig
{
    @Bean
    public KeycloakSpringBootConfigResolver keycloakSpringBootConfigResolver()
    {
        return new KeycloakSpringBootConfigResolver();
    }
}

应用程序演示

运行我们的 keycloak 应用程序,它将在http://localhost:8180上运行。我们的 Spring Boot 应用程序将在http://localhost:8080运行。

我们的 Spring Boot 应用程序的第一个屏幕如下所示:

现在,如果用户点击获取所有任务,他将被重定向到 Keycloak 登录屏幕,如下所示:

现在,我将输入我的用户 betterjavacode 用户名和密码,它将向我们显示我们的任务列表,如下所示:

认证流程

当用户单击“获取所有任务”时,用户将被重定向到 Spring Security 的 sso/login 端点,KeycloakSpringBootConfigResolver 处理该端点并向 Keycloak 发送授权代码流请求

http://localhost:8180/auth/realms/SpringBootKeycloakApp/protocol/openid-connect/auth?response_type=code&client_id=SpringBootApp&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsso%2Flogin&state=70bd4e28-89e6-43b8-8bea-94c6d057a5cf&login=true&scope=openid

Keycloak 将处理请求以响应会话代码并显示登录屏幕。

一旦用户输入凭据并且 keycloak 验证了这些凭据,它将使用授权代码进行响应,并将此代码交换为令牌,然后用户登录。

结论

在这篇文章中,展示了如何使用 Keycloak 作为身份提供者来保护您的 Spring Boot 应用程序。这样 一个简单的程序就完成了!

以上就是Spring Boot应用程序中如何使用Keycloak详解的详细内容,更多关于Spring Boot使用Keycloak的资料请关注编程网其它相关文章!

--结束END--

本文标题: Spring Boot应用程序中如何使用Keycloak详解

本文链接: https://www.lsjlt.com/news/213918.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Boot应用程序中如何使用Keycloak详解
    目录正文什么是Keycloak?我们为什么要使用Keycloak?在Spring Boot 应用程序中使用keycloak安装Keycloak添加应用程序添加用户创建 Spring ...
    99+
    2023-05-20
    Spring Boot使用Keycloak SpringBoot Keycloak
  • Spring Boot中如何使用Swagger详解
    目录Swagger 简介 配置 Swagger 添加依赖为项目开启 Swagger创建 SwaggerConfig 配置类访问 Swagger 前端页面控制器相关注解实体相关注解总结...
    99+
    2024-04-02
  • 详解使用Spring Boot开发Restful程序
    一、简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发...
    99+
    2023-05-31
    spring boot restful
  • 你是否了解如何使用 Spring Boot 开发 JavaScript 应用程序?
    Spring Boot 是一个非常流行的 Java 开发框架,它可以让开发人员更加轻松地创建高效、可靠的应用程序。但是,你是否知道 Spring Boot 还可以用于开发 JavaScript 应用程序呢?在本文中,我们将探讨如何使用 Sp...
    99+
    2023-07-02
    spring 文件 javascript
  • 详解在Spring Boot中使用Https
    本文介绍如何在Spring Boot中,使用Https提供服务,并将Http请求自动重定向到Https。Https证书巧妇难为无米之炊,开始的开始,要先取得Https证书。你可以向证书机构申请证书,也可以自己制作根证书。创建Web配置类在代...
    99+
    2023-05-31
    spring boot https
  • Spring Boot 使用Druid详解
    Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能,下面来说明如何在 SpringBoot 中配置使用Druid。步骤: 在pom.xml中加载依赖 在application.properties中加入数据源配置...
    99+
    2023-05-31
    spring boot druid
  • java中Spring boot如何使用
    这篇文章主要介绍“java中Spring boot如何使用”,在日常操作中,相信很多人在java中Spring boot如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中Spring boot如...
    99+
    2023-06-16
  • Spring Boot中如何使用Starter
    本篇内容主要讲解“Spring Boot中如何使用Starter”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot中如何使用Starter”吧!SpringBoot简介Spri...
    99+
    2023-06-16
  • 详解Spring Boot中Controller用法
    ControllerController是SpringBoot里最基本的组件,他的作用是把用户提交来的请求通过对URL的匹配,分配个不同的接收器,再进行处理,然后向用户返回结果。他的重点就在于如何从HTTP请求中获得信息,提取参数,并分发给...
    99+
    2023-05-31
    spring boot controller
  • Spring Boot Maven插件使用详解
    Spring Boot Maven插件提供了使用Spring Boot应用程序步骤如下:重新打包:创建一个可自动执行的jar或war文件。它可以替换常规工件,或者可以使用单独的分类器附加到构建生命周期。运行:运行您的Spring引导应用程序...
    99+
    2023-05-30
    spring boot maven
  • spring boot(四)之thymeleaf使用详解
    在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用。thymeleaf 是新一代的模板引擎,在spring4.0中推荐使用thymeleaf来做前端模...
    99+
    2023-05-31
    springboot thymeleaf
  • 如何在Spring Boot中使用MQTT
    目录为什么选择MQTT MQTT, 启动! 使用方式 Client模式 创建工厂类 创建工具类 Spring Integration 总结 为什么选择MQTT MQTT的定义相信很...
    99+
    2024-04-02
  • filter如何在Spring Boot中使用
    今天就跟大家聊聊有关filter如何在Spring Boot中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:...
    99+
    2023-05-31
    spring boot filter
  • JdbcTemplate如何在spring boot中使用
    JdbcTemplate如何在spring boot中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Spring对数据库的操作在jdbc上面做了深层次的封装...
    99+
    2023-05-31
    springboot emp jdbctemplate
  • Druid如何在Spring Boot中使用
    这篇文章给大家介绍Druid如何在Spring Boot中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSour...
    99+
    2023-05-31
    springboot druid
  • 如何在Spring Boot中使用Webflux
    这篇文章主要介绍“如何在Spring Boot中使用Webflux”,在日常操作中,相信很多人在如何在Spring Boot中使用Webflux问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在Spring...
    99+
    2023-06-02
  • 如何在spring boot中使用utf8mb4
    这篇文章给大家介绍如何在spring boot中使用utf8mb4,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。spring: datasource:  driver-class-name...
    99+
    2023-06-06
  • Lombok如何在Spring Boot中使用
    本篇文章给大家分享的是有关Lombok如何在Spring Boot中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。springboot是什么springboot一种全新的编...
    99+
    2023-06-14
  • 使用 Spring Boot Admin 监控应用状态的详细过程
    目录1 Spring Boot Actuator1.1 Actuator endpoint1.2 添加依赖1.3 访问端点2 Spring Boot Admin2.1 添加依赖2.2...
    99+
    2024-04-02
  • 如何使用Spring Boot+Thymeleaf
    本篇内容主要讲解“如何使用Spring Boot+Thymeleaf”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Spring Boot+Thymeleaf”吧!1. Thymeleaf...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作