转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11377620.html

一:单点登录业务接入场景

  对于大型企业,内部有各种各样的办公OA、业务系统,员工使用起来要记住不同系统的账号密码,非常不方便,因此就催生出一种统一管理账号的认证系统,即单点登录系统。

  其作用是,某位员工,在其中一个系统进行登录验证后,再打开其他系统时,就不需要再次登录,直接进入系统,十分方便快捷。

  那怎么才能做到呢?

二:接入思路原理

  1、单点登录系统

  首先,我们要有一个单点登录系统,对账号进行统一管理,我们可以将它作为一个微服务进行部署。

  在这个系统中,记录了员工的账号信息,如:工号、姓名、电话等等。

  2、业务系统

  在业务系统中,也要有对应的用户账户,因为业务系统的用户只是单点登录系统用户的一个子集或者交集而已。

  并且,业务系统中有自己的一套角色管理以及授权机制。

  3、单点登录原理

  1)在登录业务系统时,拦截未登录的请求,重定向到单点登录扫码认证接口;

  2)在单点登录页面扫码或密码登录后,单点登录系统重定向回业务系统,并且在session中携带认证账号信息;

  3)在业务系统通过过滤器,从session中尝试提取账号信息,如果提取到了,则根据账号信息[通常是用户的工号或者loginname];

     然后根据账号信息,从业务系统本身的数据库中查询出对应的用户账户名和登录密码,如果有,则说明此登录用户是本系统用户,直接调用本系统所用的登录校验机制在代码中模拟一遍登录过程,并把登录后状态信息保存到session中即可;如果找不到对应用户,则说明此用户在业务系统没有账号,禁止登入,重定向回系统登录页面或者一个消息提示页面告诉他没有系统账户。

三:接入实现

  以下基于Java进行接入说明。

  1、添加依赖

  Java的单点登录功能依赖于 cas_client_core 这个jar包,我们可以在pom文件中添加依赖:

  <!-- https://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core --><dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-core</artifactId><version>3.2.0</version></dependency>        

 

 2、配置拦截规则

  1)对于非SpringBoot构建的项目,在web.xml中配置以下拦截规则:

<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 --><listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><!-- 该过滤器用于实现单点登出功能,可选配置。 --><filter><filter-name>CAS Single Sign Out Filter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class></filter><filter-mapping><filter-name>CAS Single Sign Out Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器负责用户的认证工作,必须配置 --><filter><filter-name>CASFilter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>单点登录系统认证接口</param-value></init-param><init-param><param-name>serverName</param-name><param-value>本业务系统首页地址</param-value></init-param></filter><filter-mapping><filter-name>CASFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器负责对Ticket的校验工作,必须启用它 --><filter><filter-name>CAS Validation Filter</filter-name><filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>单点登录系统认证接口</param-value></init-param><init-param><param-name>serverName</param-name><param-value>本业务系统首页地址</param-value></init-param></filter><filter-mapping><filter-name>CAS Validation Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 --><filter><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 --><filter><filter-name>CAS Assertion Thread Local Filter</filter-name><filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class></filter><filter-mapping><filter-name>CAS Assertion Thread Local Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

  2)对于SpringBoot构建的项目,则需创建一个配置类,在其中通过方法来返回配置bean。

  首先,创建一个类,继承 WebMvcConfigurer,并重写两个方法:

  

  然后,定义过滤器配置方法,注意:一个过滤器定义一个方法,该方法返回一个配置bean:

  方法中要设置的内容,参考web.xml下配置的内容即可。

  3、编写业务系统的登录过滤器

  在业务系统处定义一个过滤器,对所有路径进行拦截校验:如果session中已有登录状态,则放行;否则,尝试从session中提取cas认证信息,并进行模拟登录逻辑;如果也没有,则重定向到业务系统登录页面使用户进行登录操作。

@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest re = (HttpServletRequest) request; //获取requestHttpServletResponse resp = (HttpServletResponse) response; //获取respinse
    AttributePrincipal attributePrincipal = (AttributePrincipal) re.getUserPrincipal(); //返回一个java.security.Principal  对象,该对象包含当前授权用户的名称String cas_account = "";String username = "";String userpass = "";//提前session中的登录信息Object object = re.getSession().getAttribute("_const_cas_assertion_");if (object != null) {Assertion assertion = (Assertion) object;fnumber = assertion.getPrincipal().getName();} else if (attributePrincipal != null) {cas_account = (String) attributePrincipal.getName();}Users userLogin = (Users) re.getSession().getAttribute("CURRENT_USER");if (userLogin == null) {if(cas_account ==null||"".equals(cas_account )){chain.doFilter(request, response);//本系统通过拦截器进行了登录状态校验,故此处放行,让后面的拦截器进行未登录重定向,而不在此处进行。当然,也可以在此处直接重定向回首页
            }}else{chain.doFilter(request, response);//若检测到登录信息,则直接放行
        }//检测到cas信息,但是又未登录,则在此处模拟登录过程    try {if (re.getSession().getAttribute("CURRENT_USER") == null) {//代码模拟登录过程:根据cas传过来的用户信息,查找本系统用户,拿到账号密码进行登录认证           模拟过程略......各系统不一样,按需实现。re.getSession().setAttribute("CURRENT_USER", 当前登录用户);resp.sendRedirect("/index?userId="+当前登录用户id);//登录成功,重定向到业务系统首页}else {if(users.size() == 0){logger.error("========users match none!========");//根据cas信息,在本系统没找到匹配用户,则返回系统登录页面或者重定向到一个错误提示页}else {logger.error("========users match more than one!========");//根据cas信息,在本系匹配到多于一个用户,则返回系统登录页面或者重定向到一个错误提示页
                            }}}} else {if(mobiles.size() == 0){logger.error("========mobile match none!========");}else {logger.error("========mobile match more than one!========");}}}} catch (Exception e) {e.printStackTrace();}chain.doFilter(request, response);}    

  最后,别忘了将自定义的filter配置到web.xml或者在配置类中书写一个注册方法。

转载于:https://www.cnblogs.com/ygj0930/p/11377620.html

业务系统接入单点登录服务相关推荐

  1. 不同业务场景Cas客户端(Java业务系统)接入

    概述 场景一.网站部分文章需要Cas认证(登录平台)通过后才能访问 1.通过拦截器,把文章访问路径进行拦截,判断当前文章是否需要cas认证 2.如果需要认证,那么调用CAS服务端进行认证,成功后回调地 ...

  2. 和后台如何对接_业务系统如何对接第三方服务?

    在产品工作中,我们时常要对接第三方服务.本文作者从过往的对接项目经历中,提炼的关于业务系统,如何对接第三方服务的方法论,希望能对你有所帮助. 随着公司业务的发展,我们有时会遇到,需要在自身业务系统中加 ...

  3. 通用权限管理系统组件 中集成多个子系统的单点登录(网站入口方式)附源码

    通用权限管理系统组件 (GPM - General Permissions Manager) 中集成多个子系统的单点登录(网站入口方式)附源码 上文中实现了直接连接数据库的方式,通过配置文件,自定义的 ...

  4. 用户登录业务逻辑(单点登录,权限登录,普通登录)

    /*** APP登录时传的参数 1管理 2维修 3安装 4巡检* 1管理APP:需要判定是账号和密码和管理员的权限* 2安装APP,4巡检APP:只需要判定账号和密码* 3维修APP:需要判定账号密码 ...

  5. 通达OA系统对接 单点登录 标准SaaS技术服务说明

    1  标准技术服务项目 标准业务类型 服务说明 服务项目 预估工期 (人/天) HR接口对接 (人员组织同步) 支持HR接口信息对接(因钉钉服务限制,做钉钉接口需要单独购买服务器进行部署) • 支持平 ...

  6. Codimd接入单点登录

    自己搭建CodiMD的过程中,尝试了许久,才将这个应用接入到了Authing的单点登录系统中,分享一下经验,希望给有需要的人使用!如果官方可以集成为官方的模板,那么一定会锦上添花 我使用的是Authi ...

  7. 登录业务介绍(单点登录)

    用户登录业务介绍 单一服务器模式 早期单一服务器,用户认证. 缺点:单点性能压力,无法扩展 SSO(single sign on)模式 分布式,SSO(single sign on)模式 优点 :  ...

  8. java ssm 多租户_(十一)java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统- SSO单点登录之OAuth2.0登录流程(2)...

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  9. 如何实现系统的单点登录?

    目录 1. 单点登录的流程是什么样的? 2. 从代码层面剖析单点登录流程 3. 跨域问题怎么解决? 4. 如何实现会话超时? 1. 单点登录的流程是什么样的? 总体来说,一次单点登录过程包括了 3 次 ...

最新文章

  1. jetty安装、配置、优化
  2. flask 配置文件和学习资料
  3. 团队项目第一阶段冲刺站立会议04
  4. python到底能用来做啥-Python那么火,到底能用来做什么?
  5. pytorch 常用层(四)
  6. springboot使用shiro配置多个过滤器和session同步案例
  7. python网络编程能做什么_python网络编程——什么是socket?
  8. 在lean trace mode下运行function
  9. Apollo进阶课程㉚丨Apollo ROS背景介绍
  10. python中的ture是常量吗_python中的true是什么
  11. ubuntu wifi
  12. DDL DML DCL 简介
  13. 基于SWT的Sash和FormLayout的自定义分隔窗体
  14. oracle sql计算百分比,Oracle sql百分比问题 - oracle 使用笔记
  15. 死记3dmax快捷键有用么?
  16. 当电竞在亚运会绽放,玩家也从此有了信仰
  17. 如何批量修改文件夹中的照片名称
  18. 阿里云创建docker免费个人容器镜像托管(私服)服务
  19. 手游平台源码有什么用处?
  20. android安卓导航下载地址,安卓导航辅助软件:Android搜星帮助文件

热门文章

  1. 根据学生分数给学生成绩分等级
  2. IBM陈国豪谈虚拟化、刀片、云计算及绿色存储
  3. python openpyxl 设置表格列宽的自动适应_Python的openpyxl列宽调整大小
  4. matlab圆周率计算,matlab代码求圆周率的简单算法
  5. 微信公众号开发-url验证
  6. 学什么编程语言以后不会过时?
  7. 安卓手机来电防火墙_手机号变“广告号”?来电显示暗藏黑色利益链!你可能也被卷入其中...
  8. 我的百度网盘分享链接
  9. 希捷250G硬盘经PM8提示分区表错误修复后不能使用
  10. GP如何进行数据比对?