spring security 整合sso全记录

  • 介绍一下我司的sso流程
  • app security 整合sso的思路
    • 要解决的问题
  • 上代码

介绍一下我司的sso流程

我司的sso流程:

  1. app在sso系统注册想被sso拦截的sso url, 本app注册了app/index
  2. sso会在公司网关层拦截 app/index的url,根据用户cookie是否携带正确token,决定是否触发登录流程(如果已经登录,则直接放行到(app/index),如果没有登录,则转发到全司统一的sso登录页面)
  3. sso验证通过后,会重定向到app(app/index),app可以拿到用户登录信息

app security 整合sso的思路

  1. app对用户提交的请求路径,利用spring security 判断用户是否登录,如未登录,则重定向到app/index, sso会在网关层抓到这个url,从而触发sso登录流程.
  2. 登录成功后,app拿到登录信息(userid等),设置认证通过,获取user在本app的角色等信息,并保存到security.
  3. 登录成功后的用户,再次访问app时,app就可以利用spring security判断用户是否登录了.

要解决的问题

  1. 可以看出,本案例中其实不需要spring security默认提供的登录页面,我们要让security知道我们想要跳转的登录url是app/index(POST方法)
  2. sso登录成功后,会跳转回到我们的app url(app/index,GET方法).怎么让security知道,并启动spring security的认证流程?
  3. 重写security的验证方法attemptAuthentication, 我们认为通过sso登录成功后,就默认登录app是验证通过的.
  4. 由于app是采用的前台loadbalance+后台机器集群的方式.前台的loadballance方式,由于我司流程,不能设置sticky session. 所以需采用springsession(redis)的方式

上代码

  1. 解决第一个问题,很简单,在spring-security.xml里面配置
<security:form-login login-page="/app/index"/>
  1. 第二个问题的解决稍微复杂一点:
    我们要重写验证流程,是显而易见的.于是,新建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全记录相关推荐

  1. Spring Security整合JWT,实现单点登录,So Easy~!

    前面整理过一篇 SpringBoot Security前后端分离,登录退出等返回json数据,也就是用Spring Security,基于SpringBoot2.1.4 RELEASE前后端分离的情况 ...

  2. Spring Security OAuth2 SSO 单点登录

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

  3. Spring Security简单SSO

    问题 简单使用Spring Security实现简单单点登录. 思路 引入Spring Security ,Spring Session Redis相关库,简单配置Spring Security实现对 ...

  4. 项目中Spring Security 整合Spring Session实现记住我功能

    Spring Session提供了与Spring Security的"我记得"身份验证的集成的支持: 目的: 更改会话过期长度 确保会话cookie在Integer.MAX_VAL ...

  5. Spring Security OAuth2 SSO

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

  6. Spring Boot 整合 WebSocket 使用记录

    这里写自定义目录标题 前言 WebSocket 简介 WebSocket 客户端(javascript前端)实现 javascript 实现 window.location获取URL中各部分 http ...

  7. Spring Security使用记录

    文章目录 **前置知识** **1.概念介绍** **1.1权限管理** **1.2完成权限管理需要三个对象** **1.3Spring Security** **1.3.1创建web工程并导入jar ...

  8. Spring Security(一):整合JWT

    违背的青春 今天写下Spring Security整合jwt的一个简单小Demo,目的是登录后实现返回token,其实整个过程很简单. 导入依赖 <dependency> <grou ...

  9. 31 | SpringBoot安全之整合Spring Security

    一.安全 应用程序的两个主要区域是"认证"和"授权"(或者访问控制),这两个主要区域是安全的两个目标. 身份验证意味着确认您自己的身份,而授权意味着授予对系统的 ...

最新文章

  1. 在服务器上排除问题的头 5 分钟
  2. 如何挑选家用交换机 交换机选购攻略分享
  3. PoE交换机不供电了该怎么办?
  4. jdeveloper优化:
  5. linux下nmap工具的使用
  6. springboot情操陶冶-@SpringBootApplication注解解析
  7. STM8学习笔记---按键KEY
  8. 【P000-008】交易费计算系统,1.1版
  9. 范莎学院 计算机,申请范莎学院
  10. ML.net 3-情绪预测
  11. HttpServletRequest对象,请求行、请求头、请求体
  12. android 应用内部存储空间不足,安卓手机储存空间不足是什么原因 需要如何解决...
  13. C++友元(友元函数)
  14. 基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s
  15. Junit新语法assertThat
  16. 基于单片机的电话拨号系统设计(#0472)
  17. 数仓日记 - 数据采集平台
  18. MapGis二次开发——基础地图目录树控件的加载
  19. Adreno GPU上Android 游戏开发介绍 (2)
  20. 一套停车场管理软件附带源代码 J2EE服务端+android客户

热门文章

  1. 宋词欣赏 -- 李清照词全集
  2. 基于MATLAB的路面裂缝检测识别算法仿真
  3. 信息系统安全实验——Week 8
  4. 详细讲解分类模型评价指标(混淆矩阵)python示例
  5. 反编译工具Virtuous Ten Studio使用
  6. 情绪,是人的底层操作系统!掌控情绪,才能掌控人生
  7. pono2的html5无法显示,ppz
  8. 小学作文计算机能帮助我们什么,小学作文电脑对我欢喜对我忧.docx
  9. 上手简单的专业麦克风,室内户外清晰录音,唯乐狗G3S体验
  10. 网络:抓包分析dns的原理