需求:将项目从springSecurity验证登录改为统一认证sso登录,将原数据库中用户账号、密码、邮箱信息迁移至统一认证端数据中,保留原客户端项目的使用SpringSecurity进行权限角色管理部分
最终选择spring boot +oauth2 ,用到 @EnableOAuth2Sso注解实现单点登录,主要参考:
Spring Boot+OAuth2,一个注解搞定单点登录! - 江南一点雨 (javaboy.org)
本文记录踩坑与学习与实战记录(未更完)
目录
基础知识学习
cas和sso(了解):
cas
通过cas实现单点登录
Spring Security
身份认证流程解析
自定义用户密码验证
Sprint Security 用户权限管理
做到一个用户只能登录一次
Spring Security基于oauth2的sso单点登录(最后使用的方式)
开源框架XXL-SSO
实战江南一点雨:
遇到的问题:
用户权限管理时
auth端无法跳转index
基础知识学习 cas和sso(了解):
【单点登录】什么是 SSO 与 CAS?_happydecai的博客-CSDN博客_cas和sso
sso是一种框架,cas是实现sso的一种方法,当然,还有其他的方法,例如cookie
cas从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最
原文链接:单点登录之CAS原理和实现_金玉良缘-CSDN博客_cas单点登录实现原理
通过cas实现单点登录Spring Security 集成CAS实现单点登录 - 阿狸哥哥 - 博客园
Spring Securitysecurity 有认证和授权两个功能 以session作为交互
身份认证流程解析最简单易懂的Spring Security 身份认证流程讲解 - 曾俊杰的专栏 - 博客园 (cnblogs.com)
自定义用户密码验证关于密码验证源码解读写于0706 · 语雀 (yuque.com)
重写密码验证filter:
SpringSecurity的自定义用户密码验证 - 洋洋哥 - 博客园 (cnblogs.com)
Sprint Security 用户权限管理1. 在config配置文件中配置:分为hasAuthority(String)、hasRole(String)、hasIpAddress(String)
(2条消息) Spring Security--角色权限判断_我和井盖都笑了博客-CSDN博客_springsecurity 判断权限
protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/api/**").hasAnyRole("ROLE_USER", "ROLE_ADMIN") .antMatchers("/admin/**").hasRole("ROLE_ADMIN") // 如果发来的请求是指定的 IP 就允许访问 // 可以通过 request.getRemoteAddr()获取 ip 地址。 .antMatchers("/api/**").hasIpAddress("localhost") .antMatchers("/api/**").hasAuthority("admin") .and().logout().deletecookies("JSESSIONID", oauthcookieName).invalidateHttpSession(true) // 这样保证在客户端logout的时候就在服务端logout .logoutSuccessUrl("http://{server.ip}/logout") .and() .authorizeRequests() .anyRequest() .authenticated(); // 保证只有单方登录,同时需要在auth端也配置这条,客户端/logout了同时就会在统一认证端也执行logout http.sessionManagement().maximumSessions(1).expiredUrl("/logout"); }
2. 使用注解@PreAuthorize 进行管理权限
@PreAuthorize 注解,顾名思义是进入方法前的权限验证,@PreAuthorize 声明这个方法所需要的权限表达式,例如:@PreAuthorize("hasAuthority('sys:dept:delete')"),
@PreAuthorize 权限控制的原理 - 简书 (jianshu.com)
3. 自定义注解进行权限管理
(2条消息) Java自定义注解实现权限管理_小识的博客-CSDN博客_注解实现权限管理
做到一个用户只能登录一次1. 最大同时登录为1,且配置session过期重定位地址,直接将原来登录处踢出
当spring security检查到session过期后,若未做任何配置,spring security会返回一个用户不友好的页面,因此我们通常需要设置一个地址,当spring security检查到session过期后,将请求重定位到我们的地址上,设置代码如下所示:
http .sessionManagement().maximumSessions(1).expiredUrl("/logout");
参考链接:
spring scurity session管理 - SegmentFault 思否
2. 当再次登录时阻止其认证而不是强制踢出上一次登录:
当一个用户已经认证过了,在另外一个地方重新进行登录认证,spring security可以阻止其再次登录认证,从而保持原来的会话可用性;具体的代码设置如下所示
http.sessionManager().maximumSession(1).maxSessionsPreventsLogin(true);
spring security 关于 http.sessionManagement().maximumSessions(1);的探究 - 岑惜 - 博客园 (cnblogs.com)
彻底理解 cookie、Session、Token1.
springbsecurity 登录token验证过滤器_彻底理解 cookie、Session、Token_weixin_39693662的博客-CSDN博客
2. springsecurity 控制session详解:
- always
如果没有session存在就创建一个
- ifRequired
如果需要就创建一个Session(默认)
- never
SpringSecurity 将不会创建Session,但是如果应用中其他地方创建了Session,那么Spring Security将会使用它。
- stateless
SpringSecurity将绝对不会创建Session
参考:
Spring Security 控制Session详解 - 简书 (jianshu.com)
3. springSecurity 修改session中的信息
遇到场景 : 前端通过session获取当前用户信息,当前用户信息在前端页面发生了改变时(比如用户update了自己的email属性);可能数据库里面已经update了,而程序没有重启或者用户没有重新登陆,则session中的值是不会发生改变的,即验证的用户信息也是不变的,前端显示也并不会更新
SpringSecurity-日常踩坑,修改session中的用户信息。 - EalenXie - 博客园 (cnblogs.com)
4. java根据session获取用户名
SpringSecurity-日常踩坑,修改session中的用户信息。 - EalenXie - 博客园 (cnblogs.com)
Spring Security基于oauth2的sso单点登录(最后使用的方式)1. oauth2 主要目的是为了第三方登录(例如微信授权), 提供以token作为访问权限
参考:Spring Security基于Oauth2的SSO单点登录怎样做? - 程序员大本营
2. 当客户端用security时:(2条消息) 基于Spring Security + OAuth2 的SSO单点登录(客户端)_Janche的博客-CSDN博客_oauth2 客户端登录
3. @EnableOAuth2Sso注解实现单点登录(在客户端使用,客户端用的是security验证登录)
(最终参考的方案)
Spring Boot+OAuth2,一个注解搞定单点登录! - 江南一点雨 (javaboy.org)
auth端连接数据库验证用户账号和密码需要配置datasource config需要配置
客户端有单独的权限管理,在security中配置,详见"Sprint Security 用户权限管理"
4. 注册
spring-security-oauth2(二十二) 重构注册逻辑_codeing-tiger-CSDN博客_oauth2 注册
开源框架XXL-SSO分布式单点登录框架XXL-SSO - 许雪里 - 博客园
实现时遇到的问题:
做了很多尝试把xxl-sso框架和springSecurity框架集成,无法实现原因:统一验证那边验证登录成功了,两边的session统一,但是客户端项目的security验证没有通过,而我们需要它的username password拦截器验证通过,才能获得我们所需要的principal
实战江南一点雨:搭建单点登录服务器,新建数据库用户表用于用户验证,
部署一个新的port将客户端配置成单点登录方式用于调试,
遇到的问题: 用户权限管理时尝试了多种方法解决用户权限管理,用security自己的配置(获取不到aizoo数据库中的权限信息,只能获取统一身份认证的),@PreAuthorize(同样的问题),自己写了拦截器和自定义注解拦截无果(拦截顺序的问题,无法跳转到统一身份认证)
auth端无法跳转index试图解决统一认证服务器登录之后无法跳转index的bug,尝试了后台控制跳转,报401错误(没有权限
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)