什么叫单点登录?
SSO(Single Sign On): 多个相互信任的系统,只要在一个系统里面登录了,其他的系统就认为你是登录状态,这就是单点登录.
session无法做单点登录,多个web系统间无法做session同步,如果非要做就做session就得同步,这样的话如果分布式系统多的话就有一个问题session风暴,多个系统之间的通道都被session充斥
什么是CAS?
CAS是2004年耶鲁大学发起的开源项目,能够实现单点登录 ,分为服务端和客户端.
1.开源的企业级单点登录解决方案
2.CAS Server 为需要独立部署的 Web 应用(war包)
3.cas client 支持很多种客户端(java)
单点登录的流程是怎么样?
client发请求给页面,页面发现他没有登录,直接将请求重定向给登录页面, 用户登录成功后,由CAS服务费给用户浏览器一个ticket(这个过程叫用户认证),之后用户访问其他页面,其他页面将根据用户的ticket交给CAS叫校验(这个过程叫票据验证),验证通过,用户可以直接访问其他的页面.
1 CAS服务端的配置
服务端比较好配置,只需要将CAS的war包放到tomcat的webapps目录下,启动tomcat解压war包就可以 ,用户只需要输入: tomcat地址+端口号+/cas 就可以直接跳转到CAS的登录页面
注意:如果有多个tomcat要注意端口号不好冲突,修改配置信息在CAS解压包的cas.properties里面
2 CAS客户端的配置
第一步:导包
导入:cas客户端包 和sevlet包,已经导入一个tomcat插件
<packaging>war</packaging> <dependencies> <!--CAS--> <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> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <!-- 指定端口 --> <port>9001</port> <!-- 请求路径 --> <path>/</path> </configuration> </plugin> </plugins> </build>
第二步 :添加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"> <!--三个过滤器分别是: 1 单点退出过滤器 2.用户认证过滤器 3.Ticket验证过滤器 --> <!--监听器--> <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> <!--这里配置服务端ip--> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>http://localhost:9100/cas/login</param-value> </init-param> <!--这里配置client端ip--> <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> <!--配置服务端ip--> <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> </web-app>
第三步:编写index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>一品优购</title> </head> <body> <h2>欢迎来到一品优购</h2> <%=request.getRemoteUser()%> <a href="http://localhost:9100/cas/logout?service=service=http//www.baidu.com">退出</a> </body> </html>
将上面的项目复制一份,叫做项目2 ,然后启动2个项目
第四步:测试查看结果
默认登录用户名和密码在deployerConfigContext.xml 配置里面,用户名:casuser 密码:Mellon ,也可以在这个配置里面添加entry,这是写死的用户名和密码,一般情况下我们需要在数据库中访问验证,这个我们交给下一篇文章解决,
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>