整整弄了一天终于搞定了,网上很多文章太老了,结合了很多篇文章终于搞定了。
首先说一下单点登录,并不是单一用户登录,不是对所有系统的用户同一管理。举个例子,一个学校有很多系统,学生选课系统,学生成绩系统等,但是在每个系统中所有学生都有一个统一的学号,我们就根据这个学号区分每个人,每个系统中的密码可以不同,单点登录就是实现了登录一个系统,所有系统通行的功能。
下载地址: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);
根据需要自行选择。