spring boot 3.2 整合 keycloak

背景

项目中用到 keycloak,因此其他所有管理页面要集成 keycloak 做统一登录认证。

Keycloak 侧配置

容器方式启动 keycloak 服务端

docker run -d --name mykeycloak -p 8080:8080         -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin         keycloak         start-dev

注意如果不能联网的话需要要提前下载好镜像。

创建域

启动后,浏览器登录 http://ip:8080,默认用户名密码:admin/admin
创建域:client
在这里插入图片描述
在这里插入图片描述

创建客户端

在这里插入图片描述
打开客户端认证
在这里插入图片描述
设置登录成功后的重定向地址(这里可以添加多个)
在这里插入图片描述
获取密钥,这个在配置 spring boot 时需要
在这里插入图片描述

创建用户

这里的用户用于统一认证。
在这里插入图片描述
设置登录密码
在这里插入图片描述

Spring boot 侧实现

keycloak 有好几种方式集成 spring boot,例如(https://www.keycloak.org/docs/latest/securing_apps/index.html):
在这里插入图片描述

之前使用的是 Adapter 方式,但是官方已经废弃了,现在统一用 oauth2。

引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

如果没有特殊要求,则直接使用 spring boot 中配置的版本即可,不用单独设置版本。

添加 Security Filter

package casuallc.github.io;

import static casuallc.github.io.global.Constants.IGNORE_AUTHENTICATION_RESOURCES;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;

@Configuration
@EnableWebSecurity
@Slf4j
public class CustomSecurityConfiguration {

    @Value("${security.enabled}")
    private boolean securityEnabled;
    @Value("${security.same-site.enabled}")
    private boolean securitySameSiteEnabled;
    @Value("${security.keycloak.enabled:false}")
    private boolean keyCloakEnabled;
    @Value("${security.oauth2.enabled:false}")
    private boolean oauth2Enabled;
    @Value("${security.oauth2.logout.url:}")
    private String oauth2LogoutUrl;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        if (!securitySameSiteEnabled) {
            http.headers(AbstractHttpConfigurer::disable);
        } else {
            http.headers(header -> header.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin));
        }

        if (securityEnabled) {
            CookieCsrfTokenRepository csrfTokenRepository = new CookieCsrfTokenRepository();
            csrfTokenRepository.setCookieCustomizer(cookie -> cookie.secure(true)
                    .maxAge(86400));
            http.csrf(csrf -> csrf.ignoringRequestMatchers(IGNORE_AUTHENTICATION_RESOURCES)
                    .csrfTokenRepository(csrfTokenRepository));
            return http.build();
        }

        // 使用其他方式认证时关闭 csrf
        http.csrf(AbstractHttpConfigurer::disable);

        if (keyCloakEnabled || oauth2Enabled) {
            http.authorizeHttpRequests(a -> a
                            .requestMatchers(IGNORE_AUTHENTICATION_RESOURCES)
                            .permitAll()
                            .anyRequest()
                            .authenticated())
                    .oauth2Login(Customizer.withDefaults());
            if (StringUtils.isNotBlank(oauth2LogoutUrl)) {
                http.logout(r -> r.logoutSuccessUrl(oauth2LogoutUrl));
            }
            log.info("{} enabled ...", keyCloakEnabled ? "Keycloak" : "Oauth2");
            return http.build();
        }

        log.info("Security CSRF disabled ...");
        return http.build();
    }
}

IGNORE_AUTHENTICATION_RESOURCES 配置了哪些请求不需要认证,比如登录地址。

添加认证配置

### --- 认证配置(需要关闭security.same-site.enabled和security.enabled) --- ###
security.keycloak.enabled=true
spring.security.oauth2.client.provider.external.issuer-uri=http://keycloak:8080/realms/test

spring.security.oauth2.client.registration.external.provider=external
# 客户端名称
spring.security.oauth2.client.registration.external.client-name=client
# 客户端名称
spring.security.oauth2.client.registration.external.client-id=client
spring.security.oauth2.client.registration.external.client-secret=配置在 keycloak client 页面获取的密钥
spring.security.oauth2.client.registration.external.scope=openid,offline_access,profile
spring.security.oauth2.client.registration.external.authorization-grant-type=authorization_code

获取登录用户

在使用 keycloak 登录后,在 request 中可以获取到用户信息

public static String getUserFromOauth2(HttpServletRequest request) {
	OAuth2AuthenticationToken token = (OAuth2AuthenticationToken) request.getUserPrincipal();
	if (token == null) {
		log.warn("Can not get keycloak user from request.");
		return null;
	}
	OAuth2User user = token.getPrincipal();
	if (user instanceof DefaultOidcUser oidcUser) {
		return oidcUser.getPreferredUsername();
	}
	if (user instanceof DefaultOAuth2User oAuth2User) {
		return oAuth2User.getName();
	}
	return user.getName();
}

最后

以上操作完成后,可以访问 spring boot 项目,会自动跳转到 keycloak 登录页面,登录成功后重定向到 spring boot 项目页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/228581.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 每日一题 Day 6(DFS+BFS)

1466. 重新规划路线 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变…

【GEE笔记】在线分类流程,标注样本点、分类和精度评价

GEE在线分类流程 介绍 GEE&#xff08;Google Earth Engine&#xff09;是一个强大的地理信息处理平台&#xff0c;可以实现在线的遥感影像分析和处理。本文将介绍如何使用GEE进行在线的分类流程&#xff0c;包括标注样本点、分类和精度评价。本文以2020年5月至8月的哨兵2影像…

优秀案例 | 元宇宙双语财经科技主播“舒望”主持首届粤港澳大湾区元宇宙国际传播论坛

12月6日&#xff0c;由南方财经全媒体集团指导、大湾区元宇宙国际传播实验室(GBA MIC Lab&#xff09;主办、南财国际传播中心和21世纪经济报道共同承办&#xff0c;以“多元共创开放共享”为主题的首届粤港澳大湾区元宇宙国际传播论坛在广州隆重开幕。 “立足湾区&#xff0c;…

【GEE笔记】随机森林特征重要性计算并排序

随机森林是一种基于多个决策树的集成学习方法&#xff0c;可以用于分类和回归问题。在gee中可以使用ee.Classifier.smileRandomForest()函数来创建一个随机森林分类器&#xff0c;并用它来对影像进行分类。 随机森林分类器有一个重要的属性&#xff0c;就是可以计算每个特征&a…

【沁恒蓝牙MESH】CH582串口中断内存溢出导致MCU频繁重启

本文主要记录了【沁恒蓝牙mesh】CH582串口中断内存溢出导致MCU频繁重启 由于开发疏忽&#xff0c;导致的数组内存溢出&#xff0c;是入门嵌入式开发经常忽视的错误&#xff0c;用以记录&#xff0c;共勉&#xff01;&#xff01; 目录 1. 遇到问题描述以及解决1.1 问题一&#…

案例063:基于微信小程序的传染病防控宣传系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

都2023年了还在搜索Maven是什么?赶紧来学习(超详细一文搞懂)

文章目录 前言1. 到底什么是 Maven2. 为什么要学Maven3. 创建一个 Maven 项目4. Maven 核心功能4.1 项目构建4.2 依赖管理 4. Maven 仓库4.1 本地仓库4.2 中央仓库4.3 私有服务器, 也称为私服 5. Maven 设置国内源5.1 配置当前项目setting5.2 设置新项目的setting 总结 前言 我…

N4694D 电子校准件(ECal),67 GHz,1.85 mm,2 端口

N4694D 电子校准件 Keysight N4694D 微波电子校准件&#xff08;ECal&#xff09;可以快速、轻松和准确地对是德科技矢量网络分析仪进行校准。 N4694D 是一款精密型 2 端口电子校准件&#xff0c;支持 1.85 mm 连接器和高达 67 GHz 的频率范围。 用户可以在阴头-阴头、阳头-阳头…

低代码开发:激发创新还是程序员的末日?

前言 近年来&#xff0c;低代码开发备受关注&#xff0c;引发了市场上的热议。这一新兴技术被标榜为具备低门槛、高效率和易集成等特性&#xff0c;然而&#xff0c;却引发了一系列的争论。究竟低代码是伪需求还是行业创新的助推器&#xff1f;它是否可能让程序员失业&#xf…

电脑报错msvcr100.dll丢失?竟有5种解决方法,全面解析

在计算机的使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是msvcr100.dll丢失。这个问题主要出现在基于Microsoft Visual Studio 2010开发的程序上&#xff0c;可能导致程序无法正常运行。本文将详细介绍msvcr100.dll是什么&#xff0c;以及如何解决其丢…

强制使用新版,Win11里隐藏的Win10要没了

系统这玩意和游戏一样&#xff0c;在许多人眼中「上一代」永远是最好的一代。 除了尝鲜测试阶段必然出现许多 Bug &#xff0c;另一个原因大概是好不容易建立的使用习惯又被打破。 Win10 到 11 的换代即是如此&#xff0c;就算不提稳定性&#xff0c;也还有一些让人至今难以适…

企业贷款行业如何获客?

贷款行业是指提供贷款服务的行业&#xff0c;包括各种类型的金融机构&#xff0c;如银行、信用社、贷款公司、保险公司等。这些机构通过向个人或企业提供贷款服务&#xff0c;满足其资金需求。 主要分为个人贷款和企业贷款。个人贷款指银行或其他金融机构向符合贷款条件的自然…

MS5228/5248/5268:2.7V 到 5.5V、 12/14/16Bit、内置基准、八通道数模转换器

MS5228/MS5248/MS5268 是一款 12/14/16bit 八通道输出的电压型 DAC &#xff0c;内部集成上电复位电路、可选内部基准、接口采用四线串口模式&#xff0c; 最高工作频率可以到 40MHz &#xff0c;可以兼容 SPI 、 QSPI 、 DSP 接口和 Microwire 串口。输出接到一个 …

电商早报 | 12月8日|母婴电商宝贝格子北京总部已人去楼空

国家邮政局&#xff1a;预计11月快递量同比增长30%&#xff0c;业务收入增长27% 12月7日消息&#xff0c;国家邮政局发布2023年11月中国快递发展指数报告。经测算&#xff0c;2023年11月中国快递发展指数为406.4&#xff0c;同比提升20%。其中发展规模指数、服务质量指数、发展…

JPA对数据库修改注意点

同一事务中获取不到修改数据 spring-boot-starter-parent版本2.7.12 Dao Query(value "select * from inventory_list where id in (?1) order by id desc",nativeQuery true) List<InventoryListEntity> getByIds(List<Integer> idList);Modifyin…

二层交换原理

二层交换设备工作在OSI模型的第二层&#xff0c;即数据链路层&#xff0c;它对数据包的转发是建立在MAC&#xff08;Media Access Control &#xff09;地址基础之上的。二层交换设备不同的接口发送和接收数据独立&#xff0c;各接口属于不同的冲突域&#xff0c;因此有效地隔离…

编译 Android gradle-4.6-all.zip 报错问题记录

编译 Android gradle-4.6-all.zip 报错问题记录 方法一&#xff1a;替换资源&#xff1a;方法二&#xff1a;修改源方法三&#xff1a;修改版本 编译时候无法下载 gradle-4.6-all Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip 方法一&#xf…

采用轨到轨输出设计 LTC6363HMS8-2、LTC6363HMS8-1、LTC6363HRD、LTC6363IDCB差分放大器I

产品详情 LTC6363 系列包括四个全差分、低功耗、低噪声放大器&#xff0c;具有经优化的轨到轨输出以驱动 SAR ADC。LTC6363 是一款独立的差分放大器&#xff0c;通常使用四个外部电阻设置其增益。LTC6363-0.5、LTC6363-1 和 LTC6363-2 都有内部匹配电阻&#xff0c;可分别创建…

Spark---DataFrame存储、Spark UDF函数、UDAF函数

四、DataFrame存储Spark UDF函数 1、储存DataFrame 1&#xff09;、将DataFrame存储为parquet文件 2&#xff09;、将DataFrame存储到JDBC数据库 3&#xff09;、将DataFrame存储到Hive表 2、UDF&#xff1a;用户自定义函数 可以自定义类实现UDFX接口 java&#xff1a; …
最新文章