SpringCloud搭建微服务之OAuth2实现SSO单点登录

news2025/1/15 23:22:56

SSO单点登录实现方式有多种,在这里不介绍理论,本文只讨论采用spring-security-oauth2来实现,本文共有三个服务,一个权限认证中心,两个客户端

1. 认证服务搭建

1.1. 引入核心依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.8.RELEASE</version>
</dependency>

1.2. 配置application.yml文件

server:
  port: 8830
  servlet:
    context-path: /auth
spring:
  application:
    name: cloud-oss-authorization-server

1.3. 编写主启动类

@EnableResourceServer
@SpringBootApplication
public class OssAuthorizationServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(OssAuthorizationServerApplication.class, args);
    }
}

可以将Authorization Server和Resource Server放在同一个服务里

1.4. 编写SecurityConfig配置类

@Order(1)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password(passwordEncoder().encode("123456"))
                .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatchers()
                .antMatchers("/login", "/oauth/authorize")
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .permitAll()
                .and().csrf().disable();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

1.5. 编写AuthorizationServerConfig配置类

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()");
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("SampleClientId")
                .secret(passwordEncoder.encode("secret"))
                .authorizedGrantTypes("authorization_code")
                .scopes("user_info")
                .autoApprove(true)
                .redirectUris("http://localhost:8831/ui1/login", "http://localhost:8832/ui2/login");
    }
}

1.6. 编写UserController类

@RestController
public class UserController {

    @RequestMapping(value = "/user/me")
    public Principal user(Principal principal) {
        System.out.println(principal);
        return principal;
    }
}

2. 客户端服务搭建

分别新建两个客户端微服务8831和8832

2.1. 引入核心依赖

<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>
<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

2.2. 配置application.yml文件

server:
  port: 8831 #另一个服务端口8832
  servlet:
    context-path: /ui1 #另一个服务路径/ui2
    register-default-servlet: true
    session:
      cookie:
        name: UISESSION1 #另一个服务cookie nameUISESSION2
spring:
  application:
    name: cloud-sso-client8831 #另一个服务名称cloud-sso-client8832
  thymeleaf:
    cache: false
security:
  basic:
    enabled: false
  oauth2:
    client:
      client-id: SampleClientId
      client-secret: secret
      access-token-uri: http://localhost:8830/auth/oauth/token
      user-authorization-uri: http://localhost:8830/auth/oauth/authorize
    resource:
      user-info-uri: http://localhost:8830/auth/user/me

2.3. 编写服务启动类

@SpringBootApplication
public class OssClientApplication extends SpringBootServletInitializer {

    @Bean
    public RequestContextListener requestContextListener() {
        return new RequestContextListener();
    }

    public static void main(String[] args) {
        SpringApplication.run(OssClientApplication.class, args);
    }
}

2.4. 编写SecurityConfig配置类

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

2.5. 编写WebConfig配置类

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/")
                .setViewName("forward:/index");
        registry.addViewController("/index");
        registry.addViewController("/securedPage");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/resources/");
    }
}

2.6. 编写登录页面index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Spring Security SSO Client 1</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
</head>
<body>
<div class="container">
    <div class="col-sm-12">
        <h1>Spring Security SSO Client 1</h1>
        <a class="btn btn-primary" href="securedPage">Login</a>
    </div>
</div>
</body>
</html>

2.7. 编写登录后跳转页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Spring Security SSO</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
</head>

<body>
<div class="container">
    <div class="col-sm-12">
        <h1>Secured Page</h1>
        Welcome, <span th:text="${#authentication.name}">Name</span>
    </div>
</div>
</body>
</html>

3. 验证

依次启动三个微服务cloud-oss-authorization-server、cloud-sso-client8831和cloud-sso-client8832
浏览器地址栏输入http://localhost:8831/ui1/
登录页
点击Login进入单点登录页
登录
输入用户名和密码admin/123456
跳转后页面

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

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

相关文章

网络服务---OSI七层参考模型及各层工作原理详解

OSI网络模型概念 OSI模型&#xff08;Open System Interconnection/Reference Model&#xff09;是指国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架&#xff0c;简称OSI。1981年&#xff0c;为了解决不同体系结构的网络的互联问题&#xff…

在IDEA中配置MySQL数据库连接以及在使用mybatis时设置sql语句的代码提示功能

在IDEA中配置MySQL数据库连接以及在使用mybatis时设置sql语句的代码提示功能 一&#xff1a;在IDEA中配置MySQL数据库连接 第一步&#xff1a;在IDEA右侧区域有database选项&#xff0c;点击进去 第二步&#xff1a;database -> data soucre -> mysql 第三步&#xf…

只看优点,这2款可视化产品你更心水谁?

现代的数据可视化设计一般喜欢追求更加高效的工具&#xff0c;我们在选择可视化工具的时候&#xff0c;一定会被繁多的可视化产品晃得眼花缭乱。今天给大家推荐2款我用过的可视化软件&#xff0c;不谈缺陷&#xff0c;只看优点&#xff0c;看看哪款更和你的心意吧&#xff01; …

Acrel-2000M马达保护与监控系统解决方案具有保护、遥控功能可实现无人或少人值守

安科瑞 李可欣 具体可咨询&#xff1a;Acrel_lkx Acrel-2000M马达保护与监控系统&#xff0c;是根据马达监控系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代马达监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、…

瑞吉外卖(五) 全局异常处理

全局异常处理如何进行全局异常处理&#xff1f;效果展示**ControllerAdvice**如何进行全局异常处理&#xff1f; 效果展示 ControllerAdvice 本质上就是Component&#xff0c;然后&#xff0c;我们来看一下此类的注释&#xff1a; 这个类是为那些声明了&#xff08;ExceptionH…

Airtest手机APP自动化操作微信

感觉Appium太垃圾了&#xff0c;于是顺手学了下Airtest 安装并解压 官网&#xff0c;有很显眼的下载按钮 下载完zip文件后进行解压 启动自带AirtestIDE.exe 不想登录的可以跳过 因为提前通过数据线连接了手机和电脑了&#xff0c;所以一进去就显示已经连接到手机设备了 当然…

前端css元素yi

996技术站 - 活在未来 | KingSun966技术站&#xff0c;极客带你看世界&#xff01;https://www.996station.com程序员开发指南Descriptionhttps://guide.996station.com css元素溢出 当子元素的尺寸超过父元素的尺寸时&#xff0c;需要设置父元素显示溢出的子元素的方式&#x…

[附源码]SSM计算机毕业设计小锅米线点餐管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Redis——》数据类型:bitmap

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型&#xff1a;bitmap一、底层结构二、最大长度三、操作示…

IPv6进阶:IPv6 过渡技术之 6to4 自动隧道

实验拓扑 R1-R3-R2之间的网络为IPv4公网&#xff1b;PC1及PC2处于IPv6孤岛。 实验需求 R1及R2为IPv6/IPv4双栈设备&#xff1b;在R1及R2上部署6to4自动隧道使得PC1及PC2能够互相访问。 实验步骤及配置 Internet Router的配置如下 [R3] interface GigabitEthernet0/0/0 [R3…

gan与dcgan训练自己的数据集

gan https://blog.csdn.net/weixin_50113231/article/details/122959899 dcgan 源码地址&#xff1a;https://github.com/carpedm20/DCGAN-tensorflow 安装教程 环境配置 将代码克隆到本地后首先按照官网所需依赖环境进行配置 由于该文章比较早所以python与tensorflow最好按…

做好QA质量管理,4大注意事项和技巧。

1、QA检查单&#xff1a;全过程质量管理体系。 为了做好过程质量管理&#xff0c;QA检查单需要按照检查类型、检查阶段、实践域、检查对象、检查项进行层层划分&#xff0c;构建了全过程质量管理体系。 如QA检查单按照检查阶段划分为&#xff1a;需求分析、系统设计、系统实现、…

5G无线技术基础自学系列 | SU-MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 通过多天线技术支持单用户在上下行数据…

SSM考试题库管理系统毕业设计源码069043

SSM考试题库管理系统 摘 要 随着计算机办公自动化程度的不断提高&#xff0c;开发各种数据库管理应用软件用于各种工作中能有效地提高工作效率&#xff0c;节省时间&#xff0c;能使学校的教学工作上一个新的台阶。传统的人工命题形成试卷&#xff0c;往往会出现大量的重复劳动…

java 串口通讯获取检验码

/*** 获取校验码* crc16 X16x15x21* 16进制报文是 02 03 00 00 00 40 CRC16* 传输的str&#xff1a;“020300000040”* 结果&#xff1a;4409* param str* return*/ public static String getCRC(String str) {byte[] bytes NumberUtils.hexStringToBytes(str);int CRC 0x000…

【Spring Boot】Spring Boot 统一功能处理

文章目录Spring拦截器为何需要Spring拦截器&#xff1f;自定义拦截器加入系统配置并配置拦截规则验证登陆拦截器添加统一访问前缀验证统一前缀是否添加成功统一异常处理统一数据返回格式Spring拦截器 为何需要Spring拦截器&#xff1f; 在之前Servlet开发中&#xff0c;对登陆…

深入理解java虚拟机:虚拟机字节码执行引擎(2)

文章目录3. 方法调用3.1 解析3.2 分派接着深入理解java虚拟机&#xff1a;虚拟机字节码执行引擎&#xff08;1&#xff09;&#xff0c;我们继续往下看&#xff1a; 3. 方法调用 方法调用并不等同于方法执行&#xff0c;方法调用阶段唯一的任务就是确定被调用方法的版本&…

【LeetCode每日一题】——771.宝石与石头

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 771.宝石与石头 四【题目描述】 给你一个字符串…

配电网电压调节及通信联系研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

三年城市NOH落地100城,毫末智行内部信剑指2025

11月29日&#xff0c;毫末智行董事长张凯、CEO顾维灏联合发布《毫末智行三周岁&#xff1a;三年磨一剑 利刃开新篇》的内部信&#xff0c;提到毫末愿景及战略目标&#xff1a;“让机器智能移动&#xff0c;给生活更多美好。”未来成长为一家产品矩阵覆盖全无人驾驶、机器人等多…