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