Spring Security简单SSO
问题
简单使用Spring Security实现简单单点登录。
思路
引入Spring Security ,Spring Session Redis相关库,简单配置Spring Security实现对用户的单点登录。
解决
Maven
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
这里需要引入Spring Session Redis库,这样的话,Spring Security就会默认使用Redis进行集成会话管理。这里主要关注Spring Security的使用,Spring Session Redis只介绍简单的配置。
Spring Session
spring.session.redis.flush-mode=on_save
spring.session.redis.namespace=xxx:session
spring.session.timeout=P30D
spring.data.redis.host=xxx.xxx.xxx.xxx
spring.data.redis.port=6379
spring.data.redis.password=${REDIS_PW}
spring.data.redis.database=0
这都是一些redis连接的简单配置,这里的redis主要作用为集中会话的存储。
Spring Security
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
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.configuration.WebSecurityCustomizer;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.session.HttpSessionEventPublisher;
import org.springframework.session.security.web.authentication.SpringSessionRememberMeServices;import static org.springframework.security.config.Customizer.withDefaults;@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfiguration {@Beanpublic WebSecurityCustomizer ignoringCustomizer() {# 忽略的请求路径return (web) -> web.ignoring().requestMatchers("/users/index");}@Beanpublic UserDetailsService userDetailsService() {# 简单创建用户认证InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());return manager;}@Beanpublic SpringSessionRememberMeServices rememberMeServices() {# 需要记住用户会话SpringSessionRememberMeServices rememberMeServices =new SpringSessionRememberMeServices();// optionally customizerememberMeServices.setAlwaysRemember(true);return rememberMeServices;}@Beanpublic HttpSessionEventPublisher httpSessionEventPublisher() {return new HttpSessionEventPublisher();}@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.cors().and().csrf().and().sessionManagement(session -> session.maximumSessions(1) # 启用Spring Security的简单SSO控制).rememberMe((rememberMe) -> rememberMe.rememberMeServices(rememberMeServices())).authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).formLogin(withDefaults()) # 启用 form 方式登录.httpBasic().disable();# 禁用 http basic方式登录return http.build();}
}
总结
到这里,就基本实现了Spring Security的简单SSO,达到的效果,就是用户用一个浏览器登录成功后,如果在另外一个浏览器上面再次登录,会导致把第一次登录的会话失效。这里的Spring Session Redis仅仅是提供一个集中会话管理。这里有个问题就是Spring Security发现用户如果需要登录,会默认让浏览器跳转到Spring Secuity的默认登录页面,这种作为rest api风格的后台服务非常不友好。下次我们再解决这个问题。值得注意的是@EnableMethodSecurity
注解,Spring Security提供了丰富的方法层面的流程控制。
参考:
- Session Management
- Spring Security without the WebSecurityConfigurerAdapter
- Breaking Changes
- SpringBoot之SpringSecurity权限注解在方法上进行权限认证多种方式
Spring Security简单SSO相关推荐
- spring security 整合sso全记录
spring security 整合sso全记录 介绍一下我司的sso流程 app security 整合sso的思路 要解决的问题 上代码 介绍一下我司的sso流程 我司的sso流程: app在ss ...
- SpringBoot + Spring Security 简单入门
这篇文章主要介绍了SpringBoot + Spring Security 简单入门 Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考 ...
- spring security简单配置
spring security简单配置 主要集中在5个类里面配置 1,实现UserDetailsService 2,实现AuthenticationManager 3,登录成功与失败的处理 4,访问拒 ...
- Spring Security OAuth2 SSO 单点登录
基于 Spring Security OAuth2 SSO 单点登录系统 SSO简介 单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自 ...
- spring security简单教程以及实现完全前后端分离
spring security是spring家族的一个安全框架,入门简单.对比shiro,它自带登录页面,自动完成登录操作.权限过滤时支持http方法过滤. 在新手入门使用时,只需要简单的配置,即可实 ...
- Spring Security简单增加短信验证码登录
查网上资料增加短信验证码登录都要增加一大推,要重头写Spring Security的实现,我呢,只想在原来的密码登录基础上简单实现一下短信验证码登录. 1.首先得先一个认证类,来认证验证码是否正确,这 ...
- Spring Security OAuth2 SSO
通常公司肯定不止一个系统,每个系统都需要进行认证和权限控制,不可能每个每个系统都自己去写,这个时候需要把登录单独提出来 登录和授权是统一的 业务系统该怎么写还怎么写 最近学习了一下Spring Sec ...
- Spring Security简单理解
最近在学习Spring Security,于是就写了这篇Spring Security的博客来记录自己的学习中的一些总结,本文主要是一些简单的原理分析,没有涉及很深的源码分析. 1. Spring S ...
- spring security 简单理解
一.简介 Spring Security 是 Spring 家族中的一个安全管理框架. 一般来说,常见的安全管理技术栈的组合是这样的: SSM + Shiro Spring Boot/Spring C ...
最新文章
- 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
- nagios和cacti的整合
- 下列有关python语言的说法正确的是-关于 Python 语言的注释,以下选项中描述正确的是( )...
- LeetCode Validate Binary Search Tree(dfs)
- VC++编译zlib
- ucharts 折线 点_ucharts图表引入的两种方式
- 物联网卡不能使用的情况有哪些
- Linux环境下NodeJS和MongoDB的安装配置
- 海航通信启动通信+大数据战略 海航宽带首次发布
- 电机学(1) - 绪论
- 如何将Android手机用作调制解调器; 无需生根,Redux
- 一起来作画吧「GitHub 热点速览 v.22.14」
- java四舍五入保留两位小数方法整理
- 解决无法修改日志时间的问题(Local time zone must be set--see zic manual page 2019 )
- oracle crm系统叫什么,常用CRM软件有哪些?
- matlab 双层规划求解,双层规划模型的遗传算法求解的Matlab源码
- IHS Markit:苹果16英寸MacBook Pro将采用英特尔第9代处理器
- 栈的压入、弹出序列和栈所有可能的弹出顺序
- 【AVD】【转载翻译】NVDEC_VideoDecoder_API_ProgGuide
- Type-C强光手电快充方案