spring security 整合sso全记录
spring security 整合sso全记录
- 介绍一下我司的sso流程
- app security 整合sso的思路
- 要解决的问题
- 上代码
介绍一下我司的sso流程
我司的sso流程:
- app在sso系统注册想被sso拦截的sso url, 本app注册了app/index
- sso会在公司网关层拦截 app/index的url,根据用户cookie是否携带正确token,决定是否触发登录流程(如果已经登录,则直接放行到(app/index),如果没有登录,则转发到全司统一的sso登录页面)
- sso验证通过后,会重定向到app(app/index),app可以拿到用户登录信息
app security 整合sso的思路
- app对用户提交的请求路径,利用spring security 判断用户是否登录,如未登录,则重定向到app/index, sso会在网关层抓到这个url,从而触发sso登录流程.
- 登录成功后,app拿到登录信息(userid等),设置认证通过,获取user在本app的角色等信息,并保存到security.
- 登录成功后的用户,再次访问app时,app就可以利用spring security判断用户是否登录了.
要解决的问题
- 可以看出,本案例中其实不需要spring security默认提供的登录页面,我们要让security知道我们想要跳转的登录url是app/index(POST方法)
- sso登录成功后,会跳转回到我们的app url(app/index,GET方法).怎么让security知道,并启动spring security的认证流程?
- 重写security的验证方法attemptAuthentication, 我们认为通过sso登录成功后,就默认登录app是验证通过的.
- 由于app是采用的前台loadbalance+后台机器集群的方式.前台的loadballance方式,由于我司流程,不能设置sticky session. 所以需采用springsession(redis)的方式
上代码
- 解决第一个问题,很简单,在spring-security.xml里面配置
<security:form-login login-page="/app/index"/>
- 第二个问题的解决稍微复杂一点:
我们要重写验证流程,是显而易见的.于是,新建cMToolAuthenticationFilter extends UsernamePasswordAuthenticationFilter
xml配置如下
<security:http auto-config="true" use-expressions="true">
......<security:custom-filter ref="cMToolAuthenticationFilter" before="FORM_LOGIN_FILTER"/>
</security:http><security:authentication-manager alias="authenticationManager"><security:authentication-provider ref="cMToolAuthenticationProvider"/>
</security:authentication-manager><bean id="cMToolAuthenticationProvider" class="com.app.provider.CMToolAuthenticationProvider"/><bean id="cMToolAuthenticationFilter" class="com.app.filter.CMToolAuthenticationFilter"><property name="authenticationManager" ref="authenticationManager"/>
</bean>
在CMToolAuthenticationFilter里面,增加initCMAuFilter方法,指定触发security验证流程的url:/app/index
public class CMToolAuthenticationFilter extends UsernamePasswordAuthenticationFilter {@PostConstructpublic void initCMAuFilter(){//这里指定触发security验证流程的url:/app/indexRequestMatcher requiresAuthenticationRequestMatcher = new AntPathRequestMatcher("/app/index", "GET");this.setRequiresAuthenticationRequestMatcher(requiresAuthenticationRequestMatcher);//这里可以顺便指定一下,登录成功后的自定义handler=>CMToolSuccessHandlerthis.setAuthenticationSuccessHandler(new CMToolSuccessHandler("/cmtv1web/home",userAuthenticateService));}
@Overridepublic Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response) throws AuthenticationException {//写你自己的登录验证逻辑.....UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, "");setDetails(request, authRequest);return super.getAuthenticationManager().authenticate(authRequest);}//指定authenticationManager@Overridepublic void setAuthenticationManager(AuthenticationManager authenticationManager) {super.setAuthenticationManager(authenticationManager);}
CMToolAuthenticationProvider
@AutowiredUserAuthenticateService userAuthenticateService;@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {String username = authentication.getName();List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();//写自己的一些给用户加角色的逻辑UserBean userBean = userAuthenticateService.getUser(username);if(userBean!=null) {//将user的角色交给spring security备用List<RoleBean> roles = userBean.getRoles();if(roles!=null&&roles.size()>0){for(RoleBean role:roles){authorities.add(new SimpleGrantedAuthority(role.getRole_name()));}}}return new UsernamePasswordAuthenticationToken(username, "", authorities);}@Overridepublic boolean supports(Class<?> authentication) {return authentication.isAssignableFrom(UsernamePasswordAuthenticationToken.class);}
spring session redis的整合, 有时间再写吧!
spring security 整合sso全记录相关推荐
- Spring Security整合JWT,实现单点登录,So Easy~!
前面整理过一篇 SpringBoot Security前后端分离,登录退出等返回json数据,也就是用Spring Security,基于SpringBoot2.1.4 RELEASE前后端分离的情况 ...
- Spring Security OAuth2 SSO 单点登录
基于 Spring Security OAuth2 SSO 单点登录系统 SSO简介 单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自 ...
- Spring Security简单SSO
问题 简单使用Spring Security实现简单单点登录. 思路 引入Spring Security ,Spring Session Redis相关库,简单配置Spring Security实现对 ...
- 项目中Spring Security 整合Spring Session实现记住我功能
Spring Session提供了与Spring Security的"我记得"身份验证的集成的支持: 目的: 更改会话过期长度 确保会话cookie在Integer.MAX_VAL ...
- Spring Security OAuth2 SSO
通常公司肯定不止一个系统,每个系统都需要进行认证和权限控制,不可能每个每个系统都自己去写,这个时候需要把登录单独提出来 登录和授权是统一的 业务系统该怎么写还怎么写 最近学习了一下Spring Sec ...
- Spring Boot 整合 WebSocket 使用记录
这里写自定义目录标题 前言 WebSocket 简介 WebSocket 客户端(javascript前端)实现 javascript 实现 window.location获取URL中各部分 http ...
- Spring Security使用记录
文章目录 **前置知识** **1.概念介绍** **1.1权限管理** **1.2完成权限管理需要三个对象** **1.3Spring Security** **1.3.1创建web工程并导入jar ...
- Spring Security(一):整合JWT
违背的青春 今天写下Spring Security整合jwt的一个简单小Demo,目的是登录后实现返回token,其实整个过程很简单. 导入依赖 <dependency> <grou ...
- 31 | SpringBoot安全之整合Spring Security
一.安全 应用程序的两个主要区域是"认证"和"授权"(或者访问控制),这两个主要区域是安全的两个目标. 身份验证意味着确认您自己的身份,而授权意味着授予对系统的 ...
最新文章
- 在服务器上排除问题的头 5 分钟
- 如何挑选家用交换机 交换机选购攻略分享
- PoE交换机不供电了该怎么办?
- jdeveloper优化:
- linux下nmap工具的使用
- springboot情操陶冶-@SpringBootApplication注解解析
- STM8学习笔记---按键KEY
- 【P000-008】交易费计算系统,1.1版
- 范莎学院 计算机,申请范莎学院
- ML.net 3-情绪预测
- HttpServletRequest对象,请求行、请求头、请求体
- android 应用内部存储空间不足,安卓手机储存空间不足是什么原因 需要如何解决...
- C++友元(友元函数)
- 基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s
- Junit新语法assertThat
- 基于单片机的电话拨号系统设计(#0472)
- 数仓日记 - 数据采集平台
- MapGis二次开发——基础地图目录树控件的加载
- Adreno GPU上Android 游戏开发介绍 (2)
- 一套停车场管理软件附带源代码 J2EE服务端+android客户