问题

简单使用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相关推荐

  1. spring security 整合sso全记录

    spring security 整合sso全记录 介绍一下我司的sso流程 app security 整合sso的思路 要解决的问题 上代码 介绍一下我司的sso流程 我司的sso流程: app在ss ...

  2. SpringBoot + Spring Security 简单入门

    这篇文章主要介绍了SpringBoot + Spring Security 简单入门 Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考 ...

  3. spring security简单配置

    spring security简单配置 主要集中在5个类里面配置 1,实现UserDetailsService 2,实现AuthenticationManager 3,登录成功与失败的处理 4,访问拒 ...

  4. Spring Security OAuth2 SSO 单点登录

    基于 Spring Security OAuth2 SSO 单点登录系统 SSO简介 单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自 ...

  5. spring security简单教程以及实现完全前后端分离

    spring security是spring家族的一个安全框架,入门简单.对比shiro,它自带登录页面,自动完成登录操作.权限过滤时支持http方法过滤. 在新手入门使用时,只需要简单的配置,即可实 ...

  6. Spring Security简单增加短信验证码登录

    查网上资料增加短信验证码登录都要增加一大推,要重头写Spring Security的实现,我呢,只想在原来的密码登录基础上简单实现一下短信验证码登录. 1.首先得先一个认证类,来认证验证码是否正确,这 ...

  7. Spring Security OAuth2 SSO

    通常公司肯定不止一个系统,每个系统都需要进行认证和权限控制,不可能每个每个系统都自己去写,这个时候需要把登录单独提出来 登录和授权是统一的 业务系统该怎么写还怎么写 最近学习了一下Spring Sec ...

  8. Spring Security简单理解

    最近在学习Spring Security,于是就写了这篇Spring Security的博客来记录自己的学习中的一些总结,本文主要是一些简单的原理分析,没有涉及很深的源码分析. 1. Spring S ...

  9. spring security 简单理解

    一.简介 Spring Security 是 Spring 家族中的一个安全管理框架. 一般来说,常见的安全管理技术栈的组合是这样的: SSM + Shiro Spring Boot/Spring C ...

最新文章

  1. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
  2. nagios和cacti的整合
  3. 下列有关python语言的说法正确的是-关于 Python 语言的注释,以下选项中描述正确的是( )...
  4. LeetCode Validate Binary Search Tree(dfs)
  5. VC++编译zlib
  6. ucharts 折线 点_ucharts图表引入的两种方式
  7. 物联网卡不能使用的情况有哪些
  8. Linux环境下NodeJS和MongoDB的安装配置
  9. 海航通信启动通信+大数据战略 海航宽带首次发布
  10. 电机学(1) - 绪论
  11. 如何将Android手机用作调制解调器; 无需生根,Redux
  12. 一起来作画吧「GitHub 热点速览 v.22.14」
  13. java四舍五入保留两位小数方法整理
  14. 解决无法修改日志时间的问题(Local time zone must be set--see zic manual page 2019 )
  15. oracle crm系统叫什么,常用CRM软件有哪些?
  16. matlab 双层规划求解,双层规划模型的遗传算法求解的Matlab源码
  17. IHS Markit:苹果16英寸MacBook Pro将采用英特尔第9代处理器
  18. 栈的压入、弹出序列和栈所有可能的弹出顺序
  19. 【AVD】【转载翻译】NVDEC_VideoDecoder_API_ProgGuide
  20. Type-C强光手电快充方案

热门文章

  1. python彩色蟒蛇绘制方向_python绘制蟒蛇,绘制五彩蟒蛇
  2. excel求方差和标准差的函数_[Excel]如何用Excel计算标准差(stdev.S和stdev.P)
  3. 安卓学习笔记—渐变色背景
  4. 软件体系结构(三)名词解释
  5. VUE项目学习系列博文
  6. Disruptor RingBuffer 原理
  7. 数据库新技术前沿总结
  8. 豆芽的生长过程观察日记-2020年
  9. cad哪个版本最好用?思路提供
  10. 基于junit4的关于个人所得税计算的等价类与边界值_关于量子力学的基本原理