cas 实现单点登录

 

整整弄了一天终于搞定了,网上很多文章太老了,结合了很多篇文章终于搞定了。

首先说一下单点登录,并不是单一用户登录,不是对所有系统的用户同一管理。举个例子,一个学校有很多系统,学生选课系统,学生成绩系统等,但是在每个系统中所有学生都有一个统一的学号,我们就根据这个学号区分每个人,每个系统中的密码可以不同,单点登录就是实现了登录一个系统,所有系统通行的功能。

下载地址:http://www.jasig.org/cas/download,要下载服务端以及客户端。

 

为了简单,我们使用http。

使用https的有关配置 看这里:cas单点登录 使用https协议

首先解压服务端压缩包,找到modules下面的cas-server-webapp-3.5.2.war,拷到tomcat的webapp中。使用http需要对服务端进行简单的修改:

1、spring-configuration》ticketGrantingTicketCookieGenerator.xml:

找到p:cookieSecure=”true”改为p:cookieSecure=”false”

2、deployerConfigContext.xml:找到

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" />

在节点下添加p:requireSecure=”false”,修改后如下:

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" p:requireSecure="false"/>

然后就正式开始我们server端的配置了:

1、在deployerConfigContext.xml中找到:

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

注释掉,然后在后面添加:

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
		<property name="sql" value="select password from users where name = ?" />
		<property name="dataSource" ref="mysqlDataSource" />
</bean>

sql是查询客户端数据库中用户表的密码和用户,验证用户登录是否成功。password对应数据库中的密码字段,name对应数据库中的登录名字段。

 

mysqlDataSource是该系统的数据库源配置:

2、在deployerConfigContext.xml中的<beans>标签中加入数据库配置:

<bean id="mysqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
   	<property name="url"><value>jdbc:mysql://liuchang:3306/test</value></property>
   	<property name="username"><value>root</value></property>
   	<property name="password"><value>123456</value></property>
</bean>

加入数据源需要添加相应的jar包到server端的项目中:

 

mysql-connector-java-5.1.18-bin.jar:mysql驱动

在这里解释一下多系统配置,如果有多个系统,那么就要配置多次上面的1、2步骤,sql以及数据源根据系统自行修改,我们不需要指定某个url请求是那个数据库,因为cas会根据用户名及密码自动查询所有已配置的数据源,当所有数据库中都没有匹配的就会返回false,登录失败的提示。

下面是客户端的配置:

1、在项目中添加jar包:

cas-client-core-3.2.1.jar

2、配置项目中的web.xml:添加filter,注意下面的配置一定要在所有项目中的filter之前

<!-- CAS -->
	
<!-- 用于单点退出,该过滤器用于实现单点退出功能,通知其他应用单点登出,可选配置 -->
<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>
		<!-- CAS server端登录URL -->
	    <param-name>casServerLoginUrl</param-name>
	    <param-value>http://liuchang:8080/cas/login</param-value>
	</init-param>
	<init-param>
		<param-name>serverName</param-name>
	    <param-value>http://localhost:8080</param-value>
	</init-param>
	<init-param>
		<param-name>useSession</param-name>
		<param-value>true</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>
    <init-param>
		<param-name>casServerUrlPrefix</param-name>
        <param-value>http://liuchang:8080/cas</param-value>
     </init-param>
     <init-param>
     	<param-name>serverName</param-name>
        <param-value>http://localhost:8080</param-value>
     </init-param>
	</filter>
	<filter-mapping>
	<filter-name>CAS Validation 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>


<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>

到此整个项目配置完成了,然后访问客户端项目,就会调转到server端的登录界面,输入正确的密码,就会跳转到客户端首页。

 

当然,此时只是调转到了客户端,但是对客户端来说用户还是没有登录。

在简单介绍下原理:

server端登录成功后会返回一个Ticket,客户端判断是否有ticket,如果存在则继续执行,不存在则调转到server端的登录页面。登录成功后我们可以在返回数据中获取到该登录用户的一些信息,比如用户名,此时,我们在根据该用户名,查询需要用到的数据并创建客户端项目中自己的session,用于以后的操作。

3、客户端获取服务端返回的信息:

首先,必须配置web.xml中“支持获取参数”的配置,获取参数的方式很多:

//1、
HttpServletRequestWrapper wrapper= new HttpServletRequestWrapper(request);
wrapper.getRemoteUser();

//2、
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
System.out.println(principal.getName());

//3、
String name = AssertionHolder.getAssertion().getPrincipal().getName();
System.out.println(name);

//4、
String user = request.getRemoteUser();
System.out.println(user);

根据需要自行选择。

发表评论