Spring Security OAuth2 SSO 单点登录

Spring Security OAuth2 SSO单点登录实战案例 在当今的网络应用中,安全性是一个不断演进的话题,尤其在用户数据保护和系统安全方面。Spring Security OAuth2 是一个强大的框架,用于构建认证和授权服务,它提供了全面的安全解决方案。本章将为您概述Spring Security OAuth2,包括它的核心功能、主要组件以及如何在应用程序中使用OAuth2协议来加强安全性能。 阅读详情

**

基于 Spring Security OAuth2 SSO 单点登录系统

**
SSO简介

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一退出(single sign-off)就是指,只需要单一的退出动作,就可以结束对于多个系统的访问权限。

Spring Security OAuth

Spring Security OAuth使用标准的Spring和Spring Security编程模型和配置惯例,为使用Spring Security with OAuth(1a)和OAuth2提供支持。OAuth协议

案例介绍

此工程分为三个模块:授权服务器(sso-auth-server)、web应用a(sso-client-a)、web应用b(sso-client-b),想达到的目的是:某一个用户在a系统登陆后在跳往b系统后不用在重复登录。

sso-auth-server:

pom:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <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>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-jwt</artifactId>
    </dependency>
</dependencies>

yml:

server:
  port: 8082
  context-path: /auth_server

SsoServerApplication.java

/**
 * @author Leone
 * @since 2018-05-07
 **/
@SpringBootApplication
public class SsoServerApplication {

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

    /**
     * 为测试环境添加相关的 Request Dumper information,便于调试
     *
     * @return
     */
    @Profile("!cloud")
    @Bean
    RequestDumperFilter requestDumperFilter() {
        return new RequestDumperFilter();
    }

}

userDetailsService.java

/**
 * @author Leone
 * @since 2018-05-07
 **/
@Component
public class SsoUserDetailsService implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return new User(username, passwordEncoder.encode("admin"), AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"));
    }
}

SsoSecurityConfig.java

/**
 * @author Leone
 * @since 2018-05-07
 **/
@Configuration
public class SsoSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .and().authorizeRequests()
                .antMatchers("/**/*.js", "/**/*.css", "/**/*.jpg", "/**/*.png")
                .permitAll()
                .anyRequest().authenticated()
                .and()
                .csrf().disable();
        //  http.formLogin().and().authorizeRequests().anyRequest().authenticated();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
}

SsoAuthServerConfig.java

/**
 * @author Leone
 * @since 2018-05-07
 **/
@Configuration
@EnableAuthorizationServer
public class SsoAuthServerConfig extends AuthorizationServerConfigurerAdapter {

    /**
     * 客户端一些配置
     *
     * @param clients
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("client1")
                .secret("secret1")
                .authorizedGrantTypes("authorization_code", "refresh_token")
                .scopes("all", "read", "write")
                .autoApprove(true)
                .and()
                .withClient("client2")
                .secret("secret2")
                .authorizedGrantTypes("authorization_code", "refresh_token")
                .scopes("all", "read", "write")
                .autoApprove(true);
    }

    /**
     * 配置jwtTokenStore
     *
     * @param endpoints
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(jwtTokenStore()).accessTokenConverter(jwtAccessTokenConverter());
    }

    /**
     * springSecurity 授权表达式
     *
     * @param security
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.tokenKeyAccess("isAuthenticated()");
    }

    /**
     * JwtTokenStore
     *
     * @return
     */
    @Bean
    public TokenStore jwtTokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

    /**
     * 生成JTW token
     *
     * @return
     */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("andy");
        return converter;
    }
}

sso-client-a
pom:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <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>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-jwt</artifactId>
    </dependency>

</dependencies>
yml:
server:
  port: 8080
  context-path: /clienta
security:
  oauth2:
    client:
      clientId: client1
      clientSecret: secret1
      access-token-uri: http://127.0.0.1:8082/auth_server/oauth/token    #请求令牌的地址
      user-authorization-uri: http://127.0.0.1:8082/auth_server/oauth/authorize    #请求认证的地址
    resource:
      jwt:
        key-uri: http://127.0.0.1:8082/auth_server/oauth/token_key   #解析jwt令牌所需要密钥的地址

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>sso-client-A</title>
</head>
<body>
    <h1>sso demo client-A</h1>
    <a href="http://127.0.0.1:8081/clientb/index.html">访问client-b</a>
</body>
</html>

SsoClientA.java

/**
 * @author Leone
 * @since 2018-05-07
 **/
@EnableOAuth2Sso
@SpringBootApplication
public class SsoClientA {
    public static void main(String[] args) {
        SpringApplication.run(SsoClientA.class, args);
    }
}

sso-client-b

pom:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <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>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-jwt</artifactId>
    </dependency>

</dependencies>

yml:

server:
  port: 8081
  context-path: /clientb
security:
  oauth2:
    client:
      clientId: client2
      clientSecret: secret2
      access-token-uri: http://127.0.0.1:8082/auth_server/oauth/token
      user-authorization-uri: http://127.0.0.1:8082/auth_server/oauth/authorize
    resource:
      jwt:
        key-uri: http://127.0.0.1:8082/auth_server/oauth/token_key

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>sso-client-B</title>
</head>
<body>
    <h1>sso demo client-B</h1>
    <a href="http://127.0.0.1:8080/clienta/index.html">访问client-a</a>
</body>
</html>

SsoClientA.java

/**
 * @author Leone
 * @since 2018-05-07
 **/
@RestController
@EnableOAuth2Sso
@SpringBootApplication
public class SsoClientB {

    @Autowired
    private OAuth2RestTemplate oAuth2RestTemplate;

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

    @GetMapping("/user")
    public Authentication user(Authentication user) {
        return user;
    }

    @Bean
    public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ClientContext oAuth2ClientContext, OAuth2ProtectedResourceDetails details){
        return new OAuth2RestTemplate(details,oAuth2ClientContext);
    }
}

项目源码:git@github.com:janlle/sso-server.git

利用Ghidra与SVD插件实现STM32固件深度逆向分析 本文详细介绍了如何利用Ghidra逆向工程框架结合SVD插件,实现对STM32固件(.bin文件)的深度逆向分析。通过加载描述芯片外设寄存器的SVD文件,Ghidra能将晦涩的硬件地址操作转换为可读的寄存器符号,极大提升了对嵌入式固件中通信协议、安全校验等关键逻辑的分析效率。文章涵盖了从Java环境搭建、工具配置到实战逆向解析的完整流程。 阅读详情

相关推荐

机器视觉学习(七)—— 卷积、边缘和滤波器

卷积运算、垂直边缘与水平边缘、滤波器

歆歆~黯了 2740

【亲测免费】 Spring Security OAuth2.0 SSO单点登录Demo

Spring Security OAuth2.0 SSO单点登录Demo 【下载地址】SpringSecurityOAuth2.0SSO单点登录Demo 这是一个基于Spring Security和OAuth 2.0协议实现的SSO单点登录Demo,专为开发者提供标准解决方案参考。项目采用Spring Boot、Spri...

gitblog_06733的博客 349

小白快速上手 labelme:新手图像标注详解教程

本教程旨在帮助初次接触 labelme 的用户快速上手该软件,掌握基本操作与标注流程,为语义分割数据集做准备。

小白一枚~ 2万+

springboot+springsecurity单点登录sso实现(csrf过滤器post验证)

springsecurity的单点登录实现起来很容易,但是对csrf的过滤器拦截卡壳了三天,现在对这个测试Demo内容整理,希望帮助到遇到同样问题的同学们! 现在开始讲解: 一共三个项目,认证服务器A、第三方平台B、第三方平台C。下面分别进行说明 一、认证服务器A 先用maven构建好一个基本项目,然后进行开发; 目录结构如下 pom引用主要加入以下四个依赖 &...

weixin_40773253的博客 2万+

信息隐藏 数字图像空域隐写与分析技术的实现

【代码】信息隐藏 数字图像空域隐写与分析技术的实现。

Yungoal的博客 468

使用 Python 调用 GitHub REST API 爬取 GitHub 仓库信息(完整指南)

GitHub 提供了功能强大的 REST API,允许开发者通过编程方式访问 GitHub 上的仓库、用户、提交记录、PR(Pull Request)等信息。GitHub REST API 是 GitHub 官方提供的 API 接口,支持通过 HTTP 请求来操作 GitHub 上的资源。在本文中,我们将使用 Python 编写一个完整的爬虫程序,调用 GitHub 的 REST API 来爬取 GitHub 仓库的信息。目前 GitHub 使用的主要是 v3 版本的 REST API。

2201_76125261的博客 1110

spring security oauth基于jwt实现sso单点登录

基于jwt实现sso单点登录 举例 两个独立的网站 淘宝 和 天猫 只要一方登录上,另一方也就登录上 注意应用a和应用b所获取的jwt token 不是相同的字符串,但通过这个jwt token 解析出来的数据都是一样的 ...

whaleluo的博客 1719

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2852

SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解

作者:波波烤鸭blog.youkuaiyun.com/qq_38526573/article/details/103409430一、什么是单点登陆单点登录(Single Sign On),简称为 S...

程序员闪充宝 6121

【python爬虫--爬取电商商品及对其销量、好差评等数据进行分析】Python爬虫爬取电商商品及大数据分析-实战

选择目标电商网站:这里选择爬取两个不同电商网站(比如京东、淘宝)上的商品数据,包括商品名称、价格、销量和评价信息。编写爬虫:通过爬虫获取商品信息并保存数据。数据清洗与对齐:将两个电商网站抓取到的数据进行统一清洗和对齐。数据分析:进行销量分析、好评与差评分析等。

Dreams°的博客 4011

2万字长文:海豚调度器(DolphinScheduler)面试题深入了解

DAG图(有向无环图)是海豚调度器中表示工作流任务依赖关系的一种方式。在DolphinScheduler中,每个任务是一个节点,任务之间的依赖关系通过有向边连接这些节点来表示。无环:保证了工作流的执行顺序是确定的,避免了无限循环的问题。有向:箭头指示了任务的执行方向,即上一个任务的输出可以作为下一个任务的输入。依赖表示:通过图形化界面,用户可以通过拖拽连接线来定义任务之间的先后顺序和依赖关系。并行处理:DAG图可以表示出任务的并行关系,允许多个任务在没有直接依赖关系的情况下同时执行。条件分支。

大模型大数据攻城狮的专栏 1329

[SpringBoot]单点登录

【实现手段】当用户提交登录请求时,就需要获取用户的IP地址与设备信息,当验证登录通过后,将此用户的JWT、IP地址、设备信息全部存入到Redis中,后续,当客户端提交请求后,在。)中,首先检查Redis中的信息,如果此JWT在Redis中存在(例如白名单),则视为有效,所以,当退出登录时,只需要在Redis中将对应的JWT删除即可。目前的代码中,将管理员的权限列表存储在JWT中,导致JWT数据太长,并且,权限数据应该视为敏感数据,不应该表现在JWT中。以上问题都可以结合Redis的应用来解决!

YJH000_的博客 6085

6、SAP HANA 建模全解析

本文全面解析了 SAP HANA 建模的核心内容,包括属性视图、分析视图和计算视图的创建与使用。文章详细介绍了建模工具的安装、不同视图类型的适用场景及操作步骤,并通过对比和案例分析帮助读者更好地理解建模流程。此外,还涵盖了建模过程中的注意事项及性能优化建议,为 SAP HANA 用户提供实用的建模指导。

juice的博客 203

使用Spring Security OAuth2实现单点登录(SSO)系统

一、单点登录SSO介绍   目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的用户名密码,同时,管理员也需要为同一个用户设置多套系统登录账号,这对系统的使用者来说显然是不方便的。我们期望的是如果存在多个系统,只需要登录一次就可以访问多个系统,只需要在其中一个系统执行注销登录操作,则所有的系统都注销登录,无需重复操作,这就是单点登录(Single Sign On 简称SSO)系统实现的功

一瓶绿茶三元钱 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定

一、说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼。本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring Security 来实现一个最简单的跨域 SSO客户端 。 二、原理说明 单点登录主流都是基于共享 cookie 来实现的,下面分别介绍 同域 和 跨域 下的两种场景具体怎样实现共享 c...

weixin_36438989的博客 1052

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于Spring Security OAuth2的SSO(单点登录)

基础理论 What is SSO? 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 What is Spring Security? Spring Security官方解释 What is OAuth2? 首先简单了解一下用于验证及授权的OAuth协议, ...

Jake Weng 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于Spring Security + OAuth2 的SSO单点登录(服务端)

理论知识 spring security OAuth2 JWT 传统登录 登录web系统后将用户信息保存在session中,sessionId写入浏览器的cookie中,每次访问系统,浏览器自动携带此cookie,服务端根据此sessionId取到相应的session,若为空则表示登录已失效,不为空则表示用户已登录,不需要用户再次输入用户名密码。 单点登录 单点登录是一种多站点...

Janche的博客 4247

Spring Cloud Security:Oauth2 实现SSO单点登录

Spring Cloud Security:Oauth2实现单点登录

Lyndon的专栏 2999

【Spring Security OAuth2】- App认证框架- 基于JWT实现SSO单点登录2

由于登录页面是在认证服务器上,所以修改认证服务器配置;其他的个性化配置,自己以后根据业务去细化@Autowired@Bean@Overridehttp.formLogin() // 更改为form表单登录.and()// 所有的请求都必须授权后才能访问;@Override自定义用户信息;无非就是之前讲过的自定义 userDetailsService/***/@Component@Autowired@Override。

smart_an的专栏 1204

SpringCloud微服务实战——搭建企业级开发框架(四十):使用Spring Security OAuth2实现单点登录(SSO)系统

一、单点登录SSO介绍   目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的用户名密码,同时,管理员也需要为同一个用户设置多套系统登录账号,这对系统的使用者来说显然是不方便的。我们期望的是如果存在多个系统,只需要登录一次就可以访问多个系统,只需要在其中一个系统执行注销登录操作,则所有的系统都注销登录,无需重复操作,这就是单点登录(Single Sign On 简称SSO)系统实现的功能

全栈程序猿的专栏 5150

spring security oauth2 配置不登陆也能访问_Spring Security Oauth2 SSO单点登录配置及原理深度剖析...

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。随着企业各系统越来越多,如办公自动化(OA)系统,财务管理系统,档案管理系统,信...

weixin_31589331的博客 2622

JWT实战 & Spring Security Oauth2整合JWT & 整合SSO单点登录

文章目录一、JWT1.1 什么是JWT1.2 JWT组成头部(header)载荷(payload)签名(signature)如何应用1.3 JJWT快速开始创建tokentoken的验证解析token过期校验自定义claims1.4 Spring Security Oauth2整合JWT整合JWT扩展JWT中的存储内容解析JWT刷新令牌 一、JWT 1.1 什么是JWT JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递j

沮丧的南瓜 4122

Spring Security Oauth2实践(3) - 单点登录(SSO)

本次分享基于Oauth2实现SSO单点登录的实践。这个场景经常用于企业开发,集成多方系统认证。分享CAS与Oauth2实现上的区别,给出Oauth2实现的一个demo,但在单点登出时,Oauth2服务端及客户需要基于过滤器方式定制开发实现。

奔跑的蜗牛 647

【SpringSecurityOAuth2】源码分析@EnableOAuth2Sso在Spring Security OAuth2 SSO单点登录场景下的作用

目录【SpringSecurityOAuth2】源码分析@EnableOAuth2Sso在Spring Security OAuth2 SSO场景下的作用一、从Spring Security OAuth2官方文档了解@EnableOAuth2Sso作用二、源码分析@EnableOAuth2Sso作用@EnableOAuth2ClientOAuth2SsoCustomConfiguration:OA...

Trust_FreeDom的专栏 1184

基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践

理论知识在此之前需要学习和了解一些前置知识包括:Spring Security:基于 Spring实现的 Web系统的认证和权限模块OAuth2:一个关于授权(authorization)的开放网络标准单点登录 (SSO):在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统JWT:在网络应用间传递信息的一种基于 JSON的开放标准((RFC 7519),用于作为JSON对象在不同系统之间进行安全地信息传输。主要使用场景一般是用来在 身份提供者和服务提供者间传递被认证的用户身份信息要完成的目

Candyz7的博客 821

【SpringSecurityOAuth2】源码分析@EnableOAuth2Sso在Spring Security OAuth2 SSO单点登录场景下的作用...

目录 一、从Spring Security OAuth2官方文档了解@EnableOAuth2Sso作用 二、源码分析@EnableOAuth2Sso作用 @EnableOAuth2Client OAuth2SsoCustomConfiguration:OAuth2 SSO自定义配置 ...

Trust_FreeDom的专栏 1207
上一篇: org.springframework.data.mapping.PropertyReferenceException: No property item found for type BItem!
下一篇: SourceTree 提交 遇到的错误
Carl God
博客等级 码龄7年 1908粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl God

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值