应用场景
当几个应用系统需要同一个入口时,那么此时就需要配置CAS统一单点登录了。
操作步骤
SSO实现有很多产品,我们今天选用的这个是耶鲁大学发明的CAS SSO服务器。这个CAS SSO是目前我看到过的功能较全的,使用也是最简单的配置式SSO服务器,它基于SPRING的原理,因此这个配置文件我们看起来因当是相当的熟悉的。
示例以cas-server-3.5.2-release.zip结合web应用完成单点登录方案验证。
1、搭建cas server环境
打开cas.zip包,解压后,将cas文件夹拷贝到tomcat的webapps中。
启动应用服务器后,war包自动部署后访问http://ip:port/cas/login打开cas登录页面,默认密码admin/admin,点击登录显示登录成功,表明cas server搭建成功。
2、配置web实现单点登录
打开应用服务器目录,进入WEB-INF目录,编辑web.xml文件,具体修改过程如下所示:
首先注释下面filter过滤器
<!--
<filter>
<filter-name>userAuthenticationFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>userAuthenticationFilter</param-value>
</init-param>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>userAuthenticationFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
-->
接下来新增过滤器如下(放到过滤器的最前面)
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<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>CAS Authentication Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>localLoginUrl</param-name>
<param-value>http://192.168.202.6:8086/dgs/login.do</param-value>
</init-param>
<!--这里的server是服务端的IP-->
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://192.168.202.6:8081/cas/login</param-value>
</init-param>
<init-param>
<param-name>renew</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://192.168.202.6:8086</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Authentication Filter</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://192.168.202.6:8081</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://192.168.202.6:8086</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>
注:以上配置中的IP地址及端口信息请结合cas服务器及web服务器实际部署情况进行修改。
如http://127.0.0.1:6080/dgs/login.do为具体应用的登录入口。
如http://127.0.0.1:8080/cas/login为CAS单点登录服务器登录入口。
3、web应用单点登录补丁
修改webapps\dgs\WEB-INF\classes中的deploy.properties文件,新增属性
SSO_LOG_EXCEPTION=http://IP:8080/cas/logout?service=http://IP:6080/dgs/login.do
http://IP:8080/cas/logout为CAS server登出连接。
4、CAS从数据库获取登录帐号和密码
CAS默认登录帐号为admin/admin仅用于测试的帐号信息,存在安全隐患,现介绍从数据库中获取帐号和密码的配置方法。
首先创建数据库表TB_SYS_USER,以MYSQL为例,脚本如下
CREATE TABLE `TB_SYS_USER` (
`USER_ID` varchar(64) NOT NULL ,
`PASSWORD` varchar(128) NOT NULL ,
PRIMARY KEY (`USER_ID`)
);
同步web应用中的帐号和密码至TB_SYS_USER中。
修改配置文件deployerConfigContext.xml,增加jdbc数据库(以MySql为例)连接
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.202.6:3306/test" />
<property name="username" value="root" />
<property name="password" value="11111" />
</bean>
配置加密方式,CAS内置有MD5加密,也可以自己编写加密类,实现PasswordEncoder接口即可:
<bean id="MD5passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<constructor-arg index="0">
<value>MD5</value>
</constructor-arg>
</bean>
注释掉默认的验证方式,采用数据库查询验证:
<!--<bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />-->
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" ></property>
<property name="sql" value="select password from tb_sys_user where user_id=?" />
<property name="passwordEncoder" ref="MD5passwordEncoder"/>
</bean>
添加相关jar包至CAS server的WEB-INF目录中的libs中,打开cas-server-3.5.2-release.zip进入modules目录,拷贝cas-server-support-jdbc-3.5.2.jar至libs中,同时下载mysql数据库连接驱动mysql-connector-java-5.0.8-bin.jar至libs中,重启CAS server。
5、服务登出访问
服务器端退出访问:http://localhost:8080/cas/logout,若希望退出后能返回则需要配置,服务端cas-servlet.xml配置
<bean id="logoutController" class="org.jasig.cas.web.LogoutController"
p:centralAuthenticationService-ref="centralAuthenticationService"
p:logoutView="casLogoutView"
p:warnCookieGenerator-ref="warnCookieGenerator"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"/>
增加属性 p:followServiceRedirects="true"
退出链接为:http://localhost:8080/cas/logout?service=http://localhost:6080/dgs