sso单点登录原理与简单实现
一、单点登录概念理解
在多个应用系统,或者是分布式系统中,用户只需要登录一次,再访问其他系统,就不需要再次登录,自动登录。
二、单点登录实现原理
要实现单点登录,主要需要解决两个问题:1.session共享,2.ajax跨域问题。可以将用户身份信息存储在第三方单点登录认证服务器,可以使用cas单点登录框架实现,cas共享用户身份信息,cookie存储用户身份信息唯一标识(所以要实现单点登录,浏览器不能禁用cookie),cas的协议过程如下图:
三、使用cas实现单点登录
1.下载cas服务端cas-server-webapp-4.0.0.war ,将其改名为 cas.war 部署到 tomcat 目录下的 webapps 下,浏览器输入 http://localhost:8080/cas/login,即可看到登录页面:
2.cas客户端搭建,可以搭建两个或两个以上的客户端项目进行测试,搭建参考下面
(1)搭建maven工程引入cas相关依赖
<dependencies>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core<artifactId>
<version>3.3.3<version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
(2)添加 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<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:8080/cas/login</param-value>
<!--这里的 server 是cas服务端的 IP 和端口,根据所部属的服务端的ip端口做相应修改-->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:9091</param-value>
<!--这里的 是cas客户端项目的 访问地址,根据项目做相应修改-->
</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:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:9091</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.单点登录测试
(1)启动cas服务端
(2)启动客户端工程1和客户端工程2
(3)在浏览器分别访问两个客户端项目,均会跳转到cas登录页面,输入用户名密码,访问其中一个客户端项目后,再访问另一个客户端项目,不需要再进行登录,单点登录实现。
4.以上测试的登录页面是cas自带的登录页面,可改为自己项目的登录页面,同时可配置用户名和密码从数据库中读取,具体实现可参考其他资料,这里不再叙述。