最主要的是先把整个一套认证流程走下来,至于完善的工作,都是没个点的工作了,相对比较简单。
主要内容
1. 新建一个web应用mywebapp1,测试与CAS服务器的认证效果
2.如果上一步骤1认证成功的话,将mywebapp1复制一份,调整若干参数,继续测试。
如果步骤1,步骤2都认证成功的话,则表示环境搭建成功
具体参数
涉及的所有参数都在我的实体机(WIN7)完成的。分别按照了3个TOMCAT服务端。
域名映射(C:\Windows\System32\drivers\etc\hosts)
1
2
|
127.0.0.1 hellocas1.com
127.0.0.1 hellocas2.com
|
主机名
zhaoguoyu-pc
重要概念及认证流程介绍
我就不重复贴了,参考一下链接
http://www.coin163.com/java/cas/ticket.html
http://www.cnblogs.com/vhua/p/cas_6.html
http://steven-wiki.readthedocs.org/en/latest/security/
http://www.blogjava.net/security/archive/2006/10/02/sso_in_action.html
操作步骤
1.cas server端在CAS普通模式时,不需要特殊配置(记住端口是8888,443)
2.部署第一个Cas Client app 。应用命名为mywebapp1。
我使用的是Maven方式部署的。
2.1 使用archetype-webapp插件创建一个项目(略)
2.2修改pom.xml文件,添加依赖
1
2
3
4
5
|
<
dependency
>
<
groupId
>org.jasig.cas</
groupId
>
<
version
>3.1.1</
version
>
<
artifactId
>cas-client-core</
artifactId
>
</
dependency
>
|
2.3配置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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
web-app
id
=
"mywebapp"
version
=
"2.4"
xmlns
=
"http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
<
display-name
>mywebapp</
display-name
>
<
description
>
Simple sample, how to use CAS Java Client 3.x.
In this sample exists a public area (/)
and a private area (/protected/*).
</
description
>
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<!-- Sign out not yet implemented -->
<!--
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
-->
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<
filter
>
<
filter-name
>CAS Authentication Filter</
filter-name
>
<
filter-class
>org.jasig.cas.client.authentication.AuthenticationFilter</
filter-class
>
<
init-param
>
<
param-name
>casServerLoginUrl</
param-name
>
<
param-value
>https://zhaoguoyu-pc/cas/login</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>serverName</
param-name
>
<
param-value
>http://zhaoguoyu-pc:8080</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>renew</
param-name
>
<
param-value
>false</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>gateway</
param-name
>
<
param-value
>false</
param-value
>
</
init-param
>
</
filter
>
<!-- 该过滤器负责对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
>https://zhaoguoyu-pc/cas/</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>serverName</
param-name
>
<
param-value
>http://zhaoguoyu-pc:8080</
param-value
>
</
init-param
>
</
filter
>
<!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<
filter
>
<
filter-name
>CAS HttpServletRequest Wrapper Filter</
filter-name
>
<
filter-class
>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</
filter-class
>
</
filter
>
<!--
该过滤器使得开发者可以通过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
>
<!-- ************************* -->
<!-- Sign out not yet implemented -->
<!--
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
<
filter-mapping
>
<
filter-name
>CAS Authentication Filter</
filter-name
>
<
url-pattern
>/protected/*</
url-pattern
>
</
filter-mapping
>
<
filter-mapping
>
<
filter-name
>CAS Validation Filter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
<
filter-mapping
>
<
filter-name
>CAS HttpServletRequest Wrapper Filter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
<
filter-mapping
>
<
filter-name
>CAS Assertion Thread Local Filter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
<!-- *********************** -->
<!-- Sign out not yet implemented -->
<!--
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
-->
<!-- *********************** -->
<
welcome-file-list
>
<
welcome-file
>index.jsp</
welcome-file
>
</
welcome-file-list
>
</
web-app
>
|
需要注意的是serverName参数,不多解释。
3.3 修改HttpServletRequestWrapperFilter类,修复client3.1.1存在的BUG。
详情见https://issues.jasig.org/browse/CASC-50
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
void
doFilter(
final
ServletRequest servletRequest,
final
ServletResponse servletResponse,
final
FilterChain filterChain)
throws
IOException, ServletException {
final
Principal principal = retrievePrincipalFromSessionOrRequest(servletRequest);
// filterChain.doFilter(new CasHttpServletRequestWrapper(
// (HttpServletRequest) servletRequest, principal), servletResponse);
if
(principal !=
null
) {
filterChain.doFilter(
new
CasHttpServletRequestWrapper((HttpServletRequest) servletRequest, principal), servletResponse);
}
else
{
filterChain.doFilter(servletRequest, servletResponse);
}
}
|
3.4 准备测试JSP,将他放到protected目录下, 因为要和web.xml中/protected/*匹配对应。
1
2
3
4
|
<
dl
>
<
dt
>Your user name:</
dt
>
<
dd
><%= request.getRemoteUser()== null ? "null" : request.getRemoteUser() %></
dd
>
</
dl
>
|
这时候,如果你把request对象打印出来,已经是被CAS包装的请求对象了。
或者这样测
1
2
3
4
5
6
7
8
9
10
11
|
<%@page import="org.jasig.cas.client.util.AbstractCasFilter"%>
<%@page import="org.jasig.cas.client.validation.Assertion"%>
<%@page import="org.jasig.cas.client.util.AssertionHolder"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.Map"%>
<%
Assertion assertion1 = (Assertion) session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
%>
<
dl
>
<
dd
><%= assertion1.getPrincipal().getName() %></
dd
>
</
dl
>
|
3.5文件效果
其中未提到的include_*.jsp,*.css,可以无视。
3.6验证mywebapp1
3.6验证mywebapp1
3.6.1 浏览器访问http://zhaoguoyu-pc:8080/app01/protected/,直接跳转
到https://zhaoguoyu-pc/cas/login?service=http%3A%2F%2Fzhaoguoyu-pc%3A8080%2Fapp01%2Fprotected%2F.
发现后缀有了service
3.6.2 输入用户名和密码(test/test),进行认证,跳转到
http://zhaoguoyu-pc:8080/app01/protected/?ticket=ST-7-x6Txage1j1plr45vhHeN-cas01.example.org
发现后缀有了ticket. 成功实现了跳转。mywebapp1验证通过
3.8编辑mywebapp2的web.xml文件, 仅仅修改下serviceName即可,注意端口和应用名,否则会出现找不到页面问题。
3.9.强最新编辑的mywebapp2,复制到另外一个tomcat的webapp目录下
3.10 重复3.6 的步骤验证mywebapp2
3.11 集成测试
(0)清理浏览器缓存后
(1)先访问mywebapp01,进行身份认证。
(2)认证后,再访问mywebapp2,看是否需要再认证。如果不需要重复认证则表示演练完成。
最后,整体来说,配置模式1还是比较简单。但是很不幸,我上周自己演练时,碰巧遇到CAS的BUG(上面3.3步骤中修复的就是它),花费了我2个晚上。我不太清楚,为什么这个BUG就没人在文档中提到呢。
接下来的演练时CAS代理模式,我又遇到一个更坑爹的问题,同样在国内博客中也是没有遇到。WHY,为什么老天对我如此不公啊。
本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1753151,如需转载请自行联系原作者