什么是单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

什么是CAS

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:

【1】开源的企业级单点登录解决方案。

【2】CAS Server 为需要独立部署的 Web 应用。

【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

SSO单点登录访问流程主要有以下步骤:

1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。

3. 用户认证:用户身份认证。

4. 发放票据:SSO服务器会产生一个随机的Service Ticket。

5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

CAS服务端部署

Cas服务端其实就是一个war包。

在资源\cas\source\cas-server-4.0.0-release\cas-server-4.0.0\modules目录下

cas-server-webapp-4.0.0.war  将其改名为cas.war放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入http://localhost:8080/cas/login  ,可看到登录页面

不要嫌弃这个页面丑,我们后期可以再提升它的颜值。暂时把注意力放在功能实现上。

这里有个固定的用户名和密码   casuser /Mellon

登录成功后会跳到登录成功的提示页面

CAS服务端配置

端口修改

如果我们不希望用8080端口访问CAS, 可以修改端口

  • 修改TOMCAT的端口

打开tomcat 目录 conf\server.xml  找到下面的配置将端口8080,改为9100

  • 修改CAS配置文件

修改cas的WEB-INF/cas.properties

server.name=http://localhost:9100
  • 去除https认证

CAS默认使用的是HTTPS协议,如果对安全要求不高,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。

  • 修改cas的WEB-INF/deployerConfigContext.xml

找到下面的配置

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"/>

这里需要增加参数p:requireSecure="false",requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用

  • 修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

找到下面配置

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"p:cookieSecure="true"p:cookieMaxAge="-1"p:cookieName="CASTGC"p:cookiePath="/cas" />

参数p:cookieSecure="true",同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。

参数p:cookieMaxAge="-1",是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。

我们这里将cookieSecure改为false ,  cookieMaxAge 改为3600

  • 修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />

​​​​​​​我们这里将cookieSecure改为false ,  cookieMaxAge 改为3600

CAS客户端入门小Demo

客户端工程1搭建

(1)搭建工程引入依赖

创建Maven工程 (war)casclient_demo1  引入cas客户端依赖并制定tomcat运行端口为9001

(2)添加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>http://localhost:9100/cas/login</param-value>  <!--这里的server是服务端的IP -->  </init-param>  <init-param>  <param-name>serverName</param-name>  <param-value>http://localhost:9001</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>http://localhost:9100/cas</param-value>  </init-param>  <init-param>  <param-name>serverName</param-name>  <param-value>http://localhost:9001</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>
</web-app>

(3)编写index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>一品优购</title>
</head>
<body>
欢迎来到一品优购
<%=request.getRemoteUser()%>
</body>
</html>

request.getRemoteUser()为获取远程登录名

客户端工程2搭建

(1)创建Maven工程 (war)casclient_demo2  引入cas客户端依赖并制定tomcat运行端口为9002

(2)创建web.xml,参照casclient_demo1  ,将serverName的值改为http://localhost:9002,一共两处

(3)创建index.jsp  ,内容显示“欢迎来到二品优购”

单点登录测试

  1. 启动cas部署的tomcat
  2. 启动客户端工程1和客户端工程2
  3. 地址栏输入http://localhost:9001/   和http://localhost:9002/  ,地址均会跳转到CAS登录页
  4. 输入用户名和密码后,页面跳转回9002  ,再次访问9001也可以打开主页面。

​​​​​​​CAS服务端界面改造

拷贝资源

(1)将品优购的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下

(2)将css  js等文件夹拷贝到  cas目录下

(3) 将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp

修改页面

编辑casLoginView.jsp 内容

(1)添加指令

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

(2)修改form标签

<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">......</form:form>

(3)  修改用户名框

<form:input id="username" tabindex="1" accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" placeholder="邮箱/用户名/手机号" class="span2 input-xfat" />

(4)修改密码框

 <form:password  id="password" tabindex="2" path="password" accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" placeholder="请输入密码" class="span2 input-xfat"   />

(5)   修改登陆按钮

<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input class="sui-btn btn-block btn-xlarge btn-danger" accesskey="l" value="登陆" type="submit" />

 Spring Security与 CAS集成

(1)引入依赖

(2)修改spring-security.xml

<!--   entry-point-ref  入口点引用 --><http use-expressions="false" entry-point-ref="casProcessingFilterEntryPoint">  <intercept-url pattern="/**" access="ROLE_USER"/>   <csrf disabled="true"/>  <!-- custom-filter为过滤器, position 表示将过滤器放在指定的位置上,before表示放在指定位置之前  ,after表示放在指定的位置之后  -->           <custom-filter ref="casAuthenticationFilter"  position="CAS_FILTER" />      <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>  <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>  </http><!-- CAS入口点 开始 --><beans:bean id="casProcessingFilterEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">  <!-- 单点登录服务器登录URL -->  <beans:property name="loginUrl" value="http://localhost:9100/cas/login"/>  <beans:property name="serviceProperties" ref="serviceProperties"/>  </beans:bean>      <beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">  <!--service 配置自身工程的根地址+/login/cas   -->  <beans:property name="service" value="http://localhost:9003/login/cas"/></beans:bean>  <!-- CAS入口点 结束 --><!-- 认证过滤器 开始 --><beans:bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">  <beans:property name="authenticationManager" ref="authenticationManager"/>  </beans:bean>  <!-- 认证管理器 --><authentication-manager alias="authenticationManager"><authentication-provider  ref="casAuthenticationProvider"></authentication-provider></authentication-manager><!-- 认证提供者 --><beans:bean id="casAuthenticationProvider"     class="org.springframework.security.cas.authentication.CasAuthenticationProvider">  <beans:property name="authenticationUserDetailsService">  <beans:bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">  <beans:constructor-arg ref="userDetailsService" />  </beans:bean>  </beans:property>  <beans:property name="serviceProperties" ref="serviceProperties"/>  <!-- ticketValidator 为票据验证器 --><beans:property name="ticketValidator">  <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">  <beans:constructor-arg index="0" value="http://localhost:9100/cas"/>  </beans:bean>  </beans:property>  <beans:property name="key" value="an_id_for_this_auth_provider_only"/> </beans:bean>        <!-- 认证类 --><beans:bean id="userDetailsService" class="cn.itcast.demo.service.UserDetailServiceImpl"/>  <!-- 认证过滤器 结束 --><!-- 单点登出  开始  -->     <beans:bean id="singleLogoutFilter" class="org.jasig.cas.client.session.SingleSignOutFilter"/>          <beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">  <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://www.baidu.com"/>  <beans:constructor-arg>  <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>  </beans:constructor-arg>  <beans:property name="filterProcessesUrl" value="/logout/cas"/>  </beans:bean>  <!-- 单点登出  结束 -->
</beans:beans>

(3)创建UserDetailsServiceImpl

public class UserDetailServiceImpl implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//构建角色集合List<GrantedAuthority> authorities=new ArrayList();authorities.add(new SimpleGrantedAuthority("ROLE_USER"));return new User(username, ""  , authorities);        }
}

(4)   获取登录名

  • web.xml 添加springmvc
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
  • 创建springmvc-servlet.xml
 <context:component-scan base-package="cn.itcast.demo" /><mvc:annotation-driven />
  • 创建UserController
@RestController
public class UserController {@RequestMapping("/findLoginUser")public void  findLoginUser(){String name = SecurityContextHolder.getContext().getAuthentication().getName();System.out.println(name);     }
}

退出登录

<beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">  <beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://localhost:9003/index2.html"/>  <beans:constructor-arg>  <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>  </beans:constructor-arg>  <beans:property name="filterProcessesUrl" value="/logout/cas"/>
</beans:bean>
单点登录  CAS            单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统单点登录流程:1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。3. 用户认证:用户身份认证。4. 发放票据:SSO服务器会产生一个随机的Service Ticket。5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。步骤:安装配置CAS服务端安装:直接将war包放到tomcat的webapp下配置: * 去除https认证,改为http* 服务端数据源配置 在cas下的web-inf下deployerconfigContext.xml中进行配置1* dataSource数据库配置2* passwordEncoder密码存入方式3* dbAuthHandler授权处理更换dbAuthHandler* 添加jar包到webapps/cas/WEB-INF/lib下* 更改登录界面1* 将我们的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui目录下,包括css等2* 添加指令3* 修改form标签,用户名密码框,修改登录按钮(并将隐藏域添加进来)* 错误提示设置国际化,将要返回的错误信息拷贝到message_zh_CN.properties中集成spring Security    (接上)    创建maven项目,建立web.xml过滤器,创建spring-security.xml,添加html页面spring-security.xml配置文件:{entry-point-ref入口点引用custom-filter过滤器CAS入口点 开始  单点登录服务器登录urlservice配置自身工程根地址结束认证过滤器 开始认证管理器认证提供者票据验证器认证类结束单点登出 }创建认证类,继承UserDetailsService

单点登录系统CAS入门相关推荐

  1. 开源单点登录系统CAS入门

    单点登录系统CAS 目录 单点登录系统CAS 什么是单点登录? CAS 介绍 CAS 服务端部署 (1)复制war包到tomcat (2)运行tomcat (3)访问CAS登录页面 CAS服务端配置 ...

  2. 开源的单点登录系统CAS入门

    单点登录 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 当一 ...

  3. 1.开源单点登录系统CAS 入门

    什么是单点登录 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案 之一.SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应 用 ...

  4. cas java单点登录_java单点登录系统CAS的简单使用

    http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...

  5. 开源单点登录系统CAS(二)

    5.CAS客户端入门 5.1客户端工程1搭建 (1)搭建工程引入依赖 创建Maven工程 (war)casclient_demo1 引入cas客户端依赖并制定tomcat运行端口为9001 <p ...

  6. 单点登录系统cas资料汇总

    http://jasig.github.io/cas/4.0.x/index.html           主页 https://jasigcas.herokuapp.com              ...

  7. 单点登录之CAS原理和实现

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  8. SpringBoot 简单实现仿CAS单点登录系统

    SpringBoot 简单实现仿CAS单点登录系统 新境界开源开源SSO项目介绍 新境界开源SSO项目实现原理大致如下: 新境界开源SSO项目登录流程介绍 新境界开源SSO项目授权登录流程介绍 新境界 ...

  9. cas client 更新ticket_有人知道 cas单点登录系统是怎么样取得proxyticket的?

    展开全部 CAS 原理和协议 从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client.CAS Server 需要独立部署,主要负责62616964757a686964616 ...

  10. CAS实现的单点登录系统

    单点登录(single sign on ),简称SSO. 纯属学习用,对来自网络的部分如果侵害了您的权力,请联系我.QQ:262800095 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访 ...

最新文章

  1. 比较全面的L1和L2正则化的解释
  2. Python学习(13)函数
  3. 阿里云宣布 Serverless 容器服务 弹性容器实例 ECI 正式商业化
  4. 学习 etcd watch api
  5. python 调用 c 生成数组_使用C类型如何将数组从C++函数返回到Python
  6. 山西计算机职业学校排名2015,2015山西专科学校排名及排行榜
  7. win7副本不是正版_征途正版官网版下载-征途正版手游官网版下载1.0
  8. 电子书籍下载第一强贴
  9. 使用高德地图加载kml文件
  10. 中国计量大学matlab,计量经济学及matlab.pdf
  11. 左程云算法Day6 图
  12. 光谱分析软件_[Howtodowx]OMNIC红外光谱分析软件
  13. 220218_110049-如何在Word文档中插入多个带有文件名的图片?
  14. GloballyDynamic:具有统一客户端API的多平台动态交付
  15. # 鸡汤贴(汇聚三观摘要)
  16. 不改一行代码,将微信小程序转成商业App?
  17. 鼠标左键双击图标出现属性窗口的问题
  18. 2021-05-03Wireshark流量包分析
  19. 城市内涝地埋式积水监测系统解决方案
  20. git 禁止分支提交

热门文章

  1. 传奇外网架设教程带图文解说——Gom引擎
  2. 屏幕中间html滚动字幕,Gom引擎屏幕中间滚动大字及屏幕其他信息滚动条脚本实例...
  3. draft.js编辑器开发笔记
  4. Windows10安装JDK配置环境变量
  5. 利用VLMCSD部署本地KMS服务器(Windows + CentOS7)
  6. 细数Android原生工程接入EasyAR-SurfaceTracking遇到的坑
  7. Easy AR Unity开发
  8. 卡尔曼滤波c语言程序,卡尔曼滤波算法及C语言实现
  9. PPT开场,吸引人的几点技巧
  10. 手心输入法皮肤制作技巧