單點登陸(Single Sign On),簡稱爲 SSO,是目前比較流行的企業業務整合的解決方案
之一。SSO 的定義是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應
用系統。
咱們目前的系統存在諸多子系統,而這些子系統是分別部署在不一樣的服務器中,那麼使
用傳統方式的 session 是沒法解決的,咱們須要使用相關的單點登陸技術來解決。css
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 等。html
SSO 單點登陸訪問流程主要有如下步驟:
1. 訪問服務:SSO 客戶端發送請求訪問應用系統提供的服務資源。
2. 定向認證:SSO 客戶端會重定向用戶請求到 SSO 服務器。
3. 用戶認證:用戶身份認證。
4. 發放票據:SSO 服務器會產生一個隨機的 Service Ticket。java
5. 驗證票據:SSO 服務器驗證票據 Service Ticket 的合法性,驗證經過後,容許客戶端訪問
服務。mysql
6. 傳輸用戶信息:SSO 服務器驗證票據經過後,傳輸用戶認證結果信息給客戶端。web
關於cas的配置spring
1.將cas.war放tomcat的webappssql
2.運行tomcat 的startup.bat數據庫
3.CAS 服務端配置
端口修改
若是咱們不但願用 8080 端口訪問 CAS, 能夠修改端口
(1) 修改 TOMCAT 的端口
打開 tomcat 目錄 conf\server.xml 找到下面的配置
將端口 8080, 改成 9000 apache
(2) 修改 CAS 配置文件
修改 cas 的 WEB-INF/cas.properties
server.name=http://localhost:9000 api
4.去除https認證
(1)修改 cas 的 WEB-INF/deployerConfigContext.xml
<bean
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationH
andler"
p:httpClient-ref="httpClient"/>
這裏須要增長參數 p:requireSecure="false", requireSecure 屬性意思爲是否須要安全驗證, 即
HTTPS, false 爲不採用
(2)修改 cas 的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
找到下面配置
p:cookieSecure="false"
p:cookieMaxAge="3600"
(3) 修改 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
5.單點退出登陸
修改 cas 系統的配置文件 cas-servlet.xml
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>
改成 true 後, 能夠在退出時跳轉頁面到目標頁面, 修改 home.html 的退出連接
<a href="http://localhost:9000/cas/logout?service=http://www.baidu.com">退出登陸</a>
6.CAS 服務端數據源設置
配置數據源
(1) 修改 cas 服務端中 web-inf 下 deployerConfigContext.xml , 添加以下配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/pinyougoudb?characterEncoding=utf8"
p:user="root"
p:password="123456" />
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="select password from tb_user where username = ?"
p:passwordEncoder-ref="passwordEncoder"/>
而後在配置文件開始部分找到以下配置
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
<property name="authenticationPolicy">
<bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
</property>
</bean>
其中
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
一句是使用固定的用戶名和密碼, 咱們在下面能夠看到這兩個 bean ,若是咱們使用數據庫認
證用戶名和密碼, 須要將這句註釋掉。
添加下面這一句配置
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
(2) 將如下三個 jar 包放入 webapps\cas\WEB-INF\lib 下
C3p0-0.9.1.2.jar
Cas-server-support-jdbc-4.0.0.jar
Mysql-connector-java-5.1.32.jar
CAS的登陸頁面須要更換
(1) 將 項目 的 登 陸 頁 login.html 以 及 配 套 的 css 圖 片 等 拷 貝 到 cas 系 統 下
WEB-INF\view\jsp\default\ui 目錄下
(2) 將原來的 casLoginView.jsp 更名(能夠爲以後的修改操做作參照),將 login.html 改
名爲 casLoginView.jsp
CAS小Demo
1.maven工程pom依賴
<dependencies>
<!-- cas -->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.1.12</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.7</source>
<target>1.7</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>
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</list
ener-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-clas
s>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://localhost:9000/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-c
lass>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:9000/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.測試頁面本身隨意編寫