"/>
6.
在文件的末尾之前加入如下代码:
com.mysql.jdbc.Driver
jdbc:
mysql:
///wsriademo
root
root
MD5
7.复制cas-server-3.4.3.1\modules\cas-server-support-jdbc-3.4.3.1.jar和mysql驱动jar包到tomcat/webapp/cas/WEB-INF/lib目录
8.配置解释:
oQueryDatabaseAuthenticationHandler是cas-server-support-jdbc提供的查询接口其中一个,QueryDatabaseAuthenticationHandler是通过配置一个SQL语句查出密码,与所给密码匹配
odataSource我就不用解释了吧,就是使用JDBC查询时的数据源
osql语句就是查询哪一张表,本例根据t_admin_user表的login_name字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;下面是t_admin_user的表结构:
oCREATETABLEt_admin_user(
oidBIGINTNOTNULLAUTO_INCREMENT,
oemailVARCHAR(255),
ologin_nameVARCHAR(255)NOTNULLUNIQUE,
onameVARCHAR(255),
opasswordVARCHAR(255),
oPRIMARYKEY(id)
)ENGINE=InnoDB;
opasswordEncoder,这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用户输入的密码然后返回即可
八、配置CAS客户端
1.添加cas-client的jar包,有两种方式:
o传统型:
下载cas-client,地址:
http:
//www.ja-sig.org/downloads/cas-clients/,然后解压cas-client-3.1.12.zip,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用
oMaven型:
o
--cas-->
o
oorg.jasig.cas.client
ocas-client-core
o3.1.12
2.设置filter
先上配置信息:
3.
--用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
4.
5.org.jasig.cas.client.session.SingleSignOutHttpSessionListener
6.
7.
8.
--该过滤器用于实现单点登出功能,可选配置。
-->
9.
10.CASSingleSignOutFilter
11.org.jasig.cas.client.session.SingleSignOutFilter
12.
13.
14.CASSingleSignOutFilter
15./*
16.
17.
18.
--该过滤器负责用户的认证工作,必须启用它-->
19.
20.CASFilter
21.org.jasig.cas.client.authentication.AuthenticationFilter
22.
23.casServerLoginUrl
24.:
8443/cas/login
25.
--这里的server是服务端的IP-->
26.
27.
28.serverName
29.http:
//localhost:
10000
30.
31.
32.
33.CASFilter
34./*
35.
36.
37.
--该过滤器负责对Ticket的校验工作,必须启用它-->
38.
39.CASValidationFilter
40.
41.org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
42.
43.casServerUrlPrefix
44.:
8443/cas
45.
46.
47.serverName
48.http:
//localhost:
10000
49.
50.
51.
52.CASValidationFilter
53./*
54.
55.
56.
--
57.该过滤器负责实现HttpServletRequest请求的包裹,
58.比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
59.-->
60.
61.CASHttpServletRequestWrapperFilter
62.
63.org.jasig.cas.client.util.HttpServletRequestWrapperFilter
64.
65.
66.CASHttpServletRequestWrapperFilter
67./*
68.
69.
70.
--
71.该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
72.比如AssertionHolder.getAssertion().getPrincipal().getName()。
73.-->
74.
75.CASAssertionThreadLocalFilter
76.org.jasig.cas.client.util.AssertionThreadLocalFilter
77.
78.
79.CASAssertionThreadLocalFilter
80./*
81.
82.
83.
--自动根据单点登录的结果设置本系统的用户信息-->
84.
85.AutoSetUserAdapterFilter
86.AutoSetUserAdapterFilter
87.com.wsria.demo.filter.AutoSetUserAdapterFilter
88.
89.
90.AutoSetUserAdapterFilter
91./*
92.
--========================单点登录结束========================-->
每个Filter的功能我就不多说了,都有注释的,关键要解释一下AutoSetUserAdapterFilter的作用和原理.
查看完整的web.xml请猛击这里(Googlecode)
93.利用AutoSetUserAdapterFilter自动根据CAS信息设置Session的用户信息:
先看一下这个Filter的源码:
好的,如果你是老程序员应该很快就清楚Filter的目的,如果不太懂我再讲解一下;
主要是通过CAS的_const_cas_assertion_获取从CAS服务器登陆的用户名,然后再根据系统内部的用户工具(UserUtil.java)来判断是否已经登录过,如果没有登录根据登录名从数据库查询用户信息,最后使用设置把用户信息设置到当前session中。
这样就把用户信息保存到了Sessino中,我们就可以通过UserUtil工具来获取当前登录的用户了,我在实例项目中也加入了此功能演示,请看代码:
main.jsp的第44行处
94.补充一下:
如果是为一个老项目添加单点登录功能,那么基本不需要其他的修改,设置好上面的filter即可;当然最好获取用户信息的地方都调用一个工具类,统一管理不容易出错。
九、美化CAS服务器界面
CAS服务端(cas-server)的界面只能在测试的时候用一下,真正系统上线肯定需要定制开发自己的页面,就想网易和CSDN的统一认证平台一样,所有子系统的认证都通过此平台来转接,大家可以根据他们的页面自己定制出适合所属应用或者公司的界面;简单介绍一下吧,复制cas\WEB-INF\view\jsp\default\ui的一些JSP文件,每一个文件的用途文件名已经区分了,自己修改了替换一下就可以了。
例如:
登录界面:
casLoginView.jsp
登录成功:
casGenericSuccess.jsp
登出界面:
casLogoutView.jsp
十、结束语
花了一下午时间终于写完了,总共十项也算完美了。
现在看来起始利用CAS实现单点登录其实不难,不要畏惧,更不要排斥!
本教程后面的代码部分均来自本博客的wsria-demo项目分支wsria-demo-sso!