Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录

news2024/11/24 17:26:43

Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录

简介

在现代 Web 应用程序中,单点登录(Single Sign-On,简称 SSO)是一个非常重要的功能。Spring Security OAuth2 是 Spring Security 框架的一个扩展,它提供了一种简单的方式来实现 SSO。在本文中,我们将介绍如何在 Spring Boot 应用程序中使用 Spring Security OAuth2 来实现单点登录。

在这里插入图片描述

准备工作

在开始之前,我们需要安装 Java 开发环境和 Maven 构建工具。此外,我们还需要一个 OAuth2 服务器,本文中我们将使用 Keycloak 作为我们的 OAuth2 服务器。

你可以从 Keycloak 官方网站下载并安装 Keycloak,并确保它正在运行。在 Keycloak 中,我们需要创建一个名为 demo 的 Realm,然后为该 Realm 创建一个名为 web 的客户端。

配置 Spring Boot 应用程序

首先,我们需要在 pom.xml 文件中添加 Spring Security OAuth2 的依赖:

<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

接下来,我们需要在 application.ymlapplication.properties 文件中配置 OAuth2 客户端信息,例如:

spring.security.oauth2.client.registration.keycloak.client-id=web
spring.security.oauth2.client.registration.keycloak.client-secret=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.keycloak.scope=openid,profile,email
spring.security.oauth2.client.provider.keycloak.token-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/token
spring.security.oauth2.client.provider.keycloak.authorization-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/auth
spring.security.oauth2.client.provider.keycloak.user-info-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/userinfo
spring.security.oauth2.client.provider.keycloak.jwk-set-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/certs
spring.security.oauth2.client.provider.keycloak.user-name-attribute=sub

在上面的配置中,我们指定了 OAuth2 客户端的相关信息,包括客户端 ID、客户端密钥、授权类型、重定向 URI、范围和提供程序的 URI。你需要根据实际情况修改这些配置。

配置 Spring Security

要使用 Spring Security OAuth2 实现单点登录,我们需要配置 Spring Security。在 Spring Boot 应用程序中,我们可以使用 @EnableOAuth2Sso 注释来启用 Spring Security OAuth2:

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception { 
        http.antMatcher("/**")
            .authorizeRequests()
            .antMatchers("/", "/login**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated();
    }
}

在上面的代码中,我们使用 @EnableOAuth2Sso 注释启用 Spring Security OAuth2,并覆盖了 WebSecurityConfigurerAdapter 中的 configure 方法来配置 Spring Security 的 HTTP 安全。我们使用 antMatcher 方法指定要保护的 URL,使用 authorizeRequests 方法配置授权规则,使用 permitAll 方法允许所有用户访问登录页面,使用 authenticated 方法要求用户必须进行身份验证才能访问其他页面。

集成用户信息

在使用 Spring Security OAuth2 进行身份验证后,我们需要将用户的信息集成到我们的应用程序中。在 Spring Security OAuth2 中,我们可以使用 @EnableOAuth2Sso 注释中的 UserDetailsService 属性来配置用户信息服务,例如:

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
            .authorizeRequests()
            .antMatchers("/", "/login**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated();
    }

    @Bean
    public GrantedAuthoritiesMapper grantedAuthoritiesMapper() {
        return (authorities) -> {
            Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
            for (GrantedAuthority authority : authorities) {
                mappedAuthorities.add(new SimpleGrantedAuthority(authority.getAuthority()));
            }
            return mappedAuthorities;
        };
    }

    @Bean
    public OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
        return oidcUserRequest -> {
            OidcUserService delegate =new OidcUserService();
            OidcUser oidcUser = delegate.loadUser(oidcUserRequest);
            Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
            mappedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER"));
            return new DefaultOAuth2User(mappedAuthorities, oidcUser.getAttributes(), oidcUser.getNameAttributeKey());
        };
    }
}

在上面的代码中,我们定义了一个 oidcUserService Bean,它使用 OidcUserService 类来加载用户信息,并将用户信息映射为 DefaultOAuth2User 对象。我们还定义了一个 grantedAuthoritiesMapper Bean,它将授权映射为与 Spring Security 兼容的形式。

集成注销功能

在单点登录中,注销功能也非常重要。在 Spring Security OAuth2 中,我们可以使用 SecurityContextLogoutHandler 类来实现注销功能,例如:

@Controller
public class LogoutController {

    @GetMapping("/logout")
    public String logout(HttpServletRequest request, HttpServletResponse response) {
        new SecurityContextLogoutHandler().logout(request, null, null);
        return "redirect:/";
    }
}

在上面的代码中,我们定义了一个 /logout 路径,当用户访问该路径时,我们将使用 SecurityContextLogoutHandler类来清除用户的身份验证信息,并将用户重定向到首页。

总结

在本文中,我们介绍了如何在 Spring Boot 应用程序中使用 Spring Security OAuth2 来实现单点登录。我们学习了如何配置 OAuth2 客户端信息、配置 Spring Security、集成用户信息和集成注销功能。希望这篇文章对你有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu宝塔显示磁盘被占满的解决方法

操作方法&#xff1a; 连接成功 Last login: Sat Mar 25 03:04:00 2023 from 192.168.153.1 rootubuntu:~# lvm lvm> lvextend -l 100%FREE /dev/mapper/ubuntu-vg/ubuntu-lv skip_dev_dir: Couldnt split up device name ubuntu-vg/ubuntu-lv. Size of logical volum…

Windows中的Tomcat服务器安装证书并设置强制https访问

官网参考 阿里云 华为云 获取证书 自己生成证书 这边介绍一个生产开发环境证书的方式&#xff1a;使用 Java 提供的工具&#xff1a;keytool keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "d:\tomcat.keystore" Tomcat服…

Golang变量初始

Golang变量初始 采用文章 本章使用go练习工具 https://tour.go-zh.org/welcome/13.1 为什么需要变量 3.1.1一个程序就是一个世界 3.1.2变量是程序的基本组成单位 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位&#xff0c;比如一个示意图 3.2 变量的介…

专门用于管理企业与自己客户之间所有信息的客户管理系统

一、开源项目简介 关于 NXCRM NXCRM 是一套基于 Laravel 的 CRM 应用程序。它包含了一个管理中心&#xff0c;可以管理用户、客户、产品、订单、商机&#xff0c;合同&#xff0c;收款&#xff0c;附件&#xff0c;联系人&#xff0c;跟进动态&#xff0c;发票&#xff0c;业…

近年GDC服务器分享合集(二): 《太空工程师》中基于预测物理的多人游戏

客户端-服务端之间的位置同步一直是游戏开发中的一道难题&#xff0c;特别是还涉及到复杂的物理运动时。对于这个话题&#xff0c;来自《太空工程师》游戏的工程师在GDC 2023上为我们带来了他们的分享——《《太空工程师》中基于预测物理的多人游戏》&#xff08;Predicted Phy…

在 openEuler 22.03 上安装 KubeSphere 实战教程

作者&#xff1a;老 Z&#xff0c;中电信数智科技有限公司山东分公司运维架构师&#xff0c;云原生爱好者&#xff0c;目前专注于云原生运维&#xff0c;云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 导图 知识点 定级&#xff1a;入…

域泛化(Domain Generalization)相关知识学习

文章目录 一、域泛化综述1&#xff09;Domain定义2&#xff09;Domain Generalization&#xff08;DG&#xff09;定义3&#xff09;一些相关领域与DG的区别4&#xff09;领域泛化的方法表示学习领域不变表示学习①基于核的方法&#xff08; kernel-based methods&#xff09;②…

python自动化(一)基础能力:9.yaml文件详解

一、什么是yaml文件 yaml 是专门用来写配置文件的语言——可以用例作为自动化框架的配置文件yaml文件其实也是一种配置文件类型&#xff0c;后缀名是.yaml或.yml都可以个人认为比yaml比json格式更方便 二、yaml语法规则 YAML 语言&#xff08;发音 /ˈjməl/ &#xff09;的设…

电力应急指挥需要哪些终端设备?

在电力应急现场&#xff0c;我们可能会面临很多复杂的情况&#xff0c;当发生电力险情时&#xff0c;现场可能会面临断电、断网、无路等问题。此时应急指挥中心很难第一时间掌控现场情况&#xff0c;指挥中心无法快速做出反应&#xff0c;无法对现场情况做出高效的应急处置决定…

Spring Boot源码中设计模式应用浅析

文章目录 1. 工厂模式1.1 详解 DefaultListableBeanFactory 2. 单例模式1.1 详解 DefaultSingletonBeanRegistry 3. 观察者模式4. 适配器模式5. 模板方法模式 背景&#xff1a;大家好&#xff0c;我是冰点。最近有网友反馈&#xff0c;他在面试过程中被面试官问到&#xff0c;设…

NVDIA GPU参数列表: 3090,4090, A40, A30,V100, A100, A800性能参数

GeForce RTX 4090 GeForce RTX 3090 Ti &#xff08;左&#xff09; GeForce RTX 3090&#xff08;右&#xff09; A40&#xff1a; The NVIDIA A40 accelerates the most demanding visual computing workloads from the data center, combining the latest NVIDIA Ampere …

如何在Spring Boot服务端实现公网远程调试并进行HTTP服务监听?具体涉及到的步骤包括端口映射等

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Hadoop学习---7、OutputFormat数据输出、MapReduce内核源码解析、Join应用、数据清洗、MapReduce开发总结

1、OutputFormat数据输出 1.1 OutputFormat接口实现类 OutputFormat是MapReduce输出的基类&#xff0c;所以实现MapReduce输出都实现了OutputFormat接口。 1、MapReduce默认的输出格式是TextOutputFormat 2、也可以自定义OutputFormat类&#xff0c;只要继承就行。 1.2 自定…

C++标准库算法std::upper_bound示例

C标准库算法std::upper_bound示例 贺志国 2023.5.25 C标准库算法std::upper_bound使用二分查找算法在已按升序排列的序列中返回指向第一个大于给定值的元素的迭代器&#xff0c;例如&#xff1a;已按升序排列的序列为{100.0, 101.5, 102.5, 102.5, 107.3}&#xff0c;第一个大…

如何优化供应商采购系统,提升供应商管理和采购流程效能

随着企业采购向数字化转型的发展&#xff0c;供应商采购系统的使用也越来越广泛。如何优化供应商采购系统&#xff0c;提升供应商管理和采购流程效能&#xff0c;已成为企业面临的重要问题。本文将为大家介绍一些优化供应商采购系统的方法&#xff0c;以提升采购效率和管理水平…

zabbix自定义监控

一、案例操作&#xff1a;自定义监控内容 案列&#xff1a;自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息 1、自定义监控内容的操作步骤 1.1 在客户端创建自定义 key 明确需要执行的 linux 命令 who | …

RocketMQ基础入门

一、MQ介绍 1.1 为什么要用MQ 消息队列是一种先进先出的数据结构 MQ 其应用场景主要包含以下3个方面 1.1.1 应用解耦 系统的耦合性越高&#xff0c;容错性就越低。以电商应用为例&#xff0c;用户创建订单后&#xff0c;如果耦合度调用库存系统、物流系统、支付系统&#…

mp3格式怎么弄?制作mp3格式文件,教您2个有效的方法!

案例&#xff1a;如何制作mp3格式的文件&#xff1f; 【我想制作自己的mp3文件&#xff0c;但不知道如何开始。有没有小伙伴可以分享一下制作mp3格式的方法&#xff1f;】 MP3是一种非常流行的音频格式&#xff0c;被广泛用于数字音频的存储和传输。制作mp3格式文件可以让您方…

推荐|x86视觉运动控制一体机VPLC710

正运动技术始终围绕客户需求不断迭代升级产品及开发&#xff0c;积极探索工控自动化高质量发展新路径&#xff0c;着眼于全力为客户提供更优质的产品与服务&#xff0c;特此开发了一款可满足全场景高速高精及中大型产线设备应用需求的x86的IPC形态控制器。 VPLC710产品简介 VP…

数字化转型入门

前言 数字化转型是指企业或组织利用数字化技术和数字化思维来提高业务效率、客户体验和创新能力的过程。在当今的数字化时代&#xff0c;企业或组织要想在激烈的市场竞争中获得竞争优势&#xff0c;就必须积极推进数字化转型。本指南将从数字化转型的概念、影响、挑战、关键因…