分为三部分,1、Browser浏览器。2、Client Server客户服务器(也称之为应用服务器application) 3、casServer cas服务器。
单点登陆:
Browser发起请求,访问某一页面,client检测browser的cookie中的sessionID,如果已经存在,找到对应的session,通过session找到TGC票据,去cas验证,成功,则允许访问;不成功,则为其新建一个session,client重定向到cas,重定向的过程中将client的url和新建的session的sessionID一起发送过去。cas要求brower登陆,验证其输入的用户名和密码(去数据库中验证)。如果验证成功,则产生一个唯一的,不易被破解的TGC票据,将此票据发送给client,client再去cas验证其票据的有效性,有效,则允许登陆。这样,登陆一次的用户,再去访问其他持有票据的应用(统称为client)时,client都会根据访者的sessionID获得session,通过session获得票据,再去cas验证票据有效性,成功登陆……完成单点登陆。
Cas服务端的web.xml:
找到<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
我们可以将其注释掉,换成我们希望的一个 AuthenticationHandler,比如,使用QueryDatabaseAuthenticationHandler 或 SearchModeSearchDatabaseAuthenticationHandler 可以分别选取
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="casDataSource" />
<property name="sql" value="select password from xt_yhxx where lower(YHMC) = lower(?)" />
<property name="passwordEncoder" ref="myPasswordEncoder"/>
</bean>
<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
</property>
<property name="username">
<value>stock</value>
</property>
<property name="password">
<value>111111</value>
</property>
</bean>
客户端:
web.xml文件:
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://MICROSOF-3DBBD1:8443/cas-server-webapp/login</param-value>
</init-param>
<init-param>
<!-- the server name of the server this application is hosted on. -->
<param-name>serverName</param-name>
<param-value>http://MICROSOF-3DBBD1:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/rs/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/Home.html</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>
<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>
单点登出:
Browser 发起logOut请求到client,client重定向到casServier的/cas/logout,client重定向时将获得的sessionID传送到cas。cas根据收到的sessionId删除对应的session,然后找到所有通过TGC票据登陆的client服务器,发送请求。client收到后请求后,会解析收到的请求,根据sessionID删除对应的session。完成单点登出。
服务端:
cas单点退出直接链接到服务器的logout地址,为了使退出后能返回原来的项目,需要做的修改。
1.服务端cas-servlet.xml配置
<bean id="logoutController" class="org.jasig.cas.web.LogoutController" ... .../>
增加属性 p:followServiceRedirects="true"
2.退出的链接后加上?service=希望退出后返回的地址
例如 client1的退出 <a href="http://cas.google.com.cn/logout?service=http://client1.google.com.cn">退出</a>
client2的退出 <a href="http://cas.google.com.cn/logout?service=http://client2.google.com.cn">退出</a>
客户端:
<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>
<listener>
<listener-class>
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
</listener-class>
</listener>