前言
<a href="http://dba10g.blog.51cto.com/764602/1753086" target="_blank"> java cas單點登入之一:搭建cas伺服器 </a>
<a href="http://dba10g.blog.51cto.com/764602/1753151" target="_blank">java cas單點登入之二:cas普通模式1演練 </a>
代理模式相相對上一節的普通模式,更加複雜了。但配置起來也會稍微有些差别。所謂難者不會,會者不難。如果遇到一個從來沒有遇到的問題,解決起來也是非常棘手的,當然解決之後就不是事了。我就遇到了一個cas 坑爹的錯誤。一步步按照别人的部落格坐下來,普通模式部署沒有多大問題,就是不知道為什麼代理模式總是出錯,搜遍了整個網絡,也沒找到問題所在,我就納悶了,為什麼就沒有人 遇到過呢。還好,最後我使用了殺手锏,部署源碼一步步跟蹤找到了問題所在。
主要内容
搭建一整套環境.包括(cas-server ,cas proxy client,cas back-end app client)
一共三個web應用。
具體參數
涉及的所有參數都在我的實體機(win7)完成的。分别按照了3個tomcat服務端。
tomcat6.0.36
jdk7
cas server
8888,443
配置見 java cas單點登入之一
cas proxy client
8080
改造java cas單點登入之二的mywebapp1,改名為proxyclient
cas back-end service client
8070
改造java cas單點登入之二的
mywebapp2
域名映射(c:\windows\system32\drivers\etc\hosts)
1
2
<code>127.0.0.1 hellocas1.com</code>
<code>127.0.0.1 hellocas2.com</code>
主機名
zhaoguoyu-pc
操作步驟
修改cas server端支援代理功能。
就是這一步在其他文章中根本沒有提到,我不知道是版本問題,還是什麼問題。如果不配置,通路背景應用時會報 service.not.authorized.proxy異常。
1.1 修改 deployerconfigcontext.xml檔案支援代理
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
<code><</code><code>bean</code>
<code> </code><code>id</code><code>=</code><code>"serviceregistrydao"</code>
<code> </code><code>class</code><code>=</code><code>"org.jasig.cas.services.inmemoryserviceregistrydaoimpl"</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"registeredservices"</code><code>></code>
<code> </code><code><</code><code>list</code><code>></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"org.jasig.cas.services.regexregisteredservice"</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"id"</code> <code>value</code><code>=</code><code>"0"</code> <code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"name"</code> <code>value</code><code>=</code><code>"http and imap"</code> <code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"description"</code> <code>value</code><code>=</code><code>"allows http(s) and imap(s) protocols"</code> <code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"serviceid"</code> <code>value</code><code>=</code><code>"^(https?|imaps?)://.*"</code> <code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"evaluationorder"</code> <code>value</code><code>=</code><code>"10000001"</code> <code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"allowedtoproxy"</code> <code>value</code><code>=</code><code>"true"</code><code>/></code>
<code> </code><code></</code><code>bean</code><code>></code>
<code> </code><code><!--</code>
<code> </code><code>use the following definition instead of the above to further restrict access</code>
<code> </code><code>to services within your domain (including subdomains).</code>
<code> </code><code>note that example.com must be replaced with the domain you wish to permit.</code>
<code> </code><code>--></code>
<code> </code><code><bean class="org.jasig.cas.services.regexregisteredservice"></code>
<code> </code><code><property name="id" value="1" /></code>
<code> </code><code><property name="name" value="http and imap on example.com" /></code>
<code> </code><code><property name="description" value="allows http(s) and imap(s) protocols on example.com" /></code>
<code> </code><code><property name="serviceid" value="^(https?|imaps?)://([a-za-z0-9_-]+\.)*example\.com/.*" /></code>
<code> </code><code><property name="evaluationorder" value="0" /></code>
<code> </code><code></bean></code>
<code> </code><code></</code><code>list</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
<code> </code><code></</code><code>bean</code><code>></code>
就是添加 這個屬性标簽,
<code><</code><code>property</code> <code>name</code><code>=</code><code>"allowedtoproxy"</code> <code>value</code><code>=</code><code>"true"</code><code>/></code>
我就是坑在這裡了,坑了近3個晚上。,苦逼啊。現在回想起來真的太傻了。如果沒這個插曲,我想cas我可能又走馬觀花研究一兩個晚上而已,正是這個插曲,燃起了我的鬥志,是以也幹脆寫一個系列吧。
1.2 為了演練友善,修改 deployerconfigcontext.xml檔案,不需要安全請求。
<code><</code><code>bean</code> <code>class</code><code>=</code><code>"org.jasig.cas.authentication.handler.support.httpbasedservicecredentialsauthenticationhandler"</code>
<code> </code>
<code>p:httpclient-ref</code><code>=</code><code>"httpclient"</code> <code>p:requiresecure</code><code>=</code><code>"false"</code><code>/></code>
就是添加這個屬性
<code>p:requiresecure="false"</code>
通過上面2步的配置,cas服務增加了代理,同時也支援普通連接配接通路了。
2.配置代理服務
在上一節的基礎上,改造原來的web.xml,作為代理使用。
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
119
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?></code>
<code><</code><code>web-app</code> <code>id</code><code>=</code><code>"mywebapp"</code> <code>version</code><code>=</code><code>"2.4"</code> <code>xmlns</code><code>=</code><code>"http://java.sun.com/xml/ns/j2ee"</code> <code>xmlns:xsi</code><code>=</code><code>"http://www.w3.org/2001/xmlschema-instance"</code> <code>xsi:schemalocation</code><code>=</code><code>"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</code><code>></code>
<code> </code><code><</code><code>display-name</code><code>>mywebapp</</code><code>display-name</code><code>></code>
<code> </code><code><!-- sign out not yet implemented --></code>
<code> </code><code><!--</code>
<code> </code><code><filter></code>
<code> </code><code><filter-name>cas single sign out filter</filter-name></code>
<code> </code><code><filter-class>org.jasig.cas.client.session.singlesignoutfilter</filter-class></code>
<code> </code><code></filter></code>
<code> </code><code>--></code>
<code> </code><code><</code><code>filter</code><code>></code>
<code> </code><code><</code><code>filter-name</code><code>>cas authentication filter</</code><code>filter-name</code><code>></code>
<code> </code><code><</code><code>filter-class</code><code>>org.jasig.cas.client.authentication.authenticationfilter</</code><code>filter-class</code><code>></code>
<code> </code><code><</code><code>init-param</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>casserverloginurl</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>https://zhaoguoyu-pc/cas/login</</code><code>param-value</code><code>></code>
<code> </code><code></</code><code>init-param</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>servername</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>http://zhaoguoyu-pc:8080</</code><code>param-value</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>renew</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>false</</code><code>param-value</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>gateway</</code><code>param-name</code><code>></code>
<code> </code><code></</code><code>filter</code><code>></code>
<code> </code><code><</code><code>filter-name</code><code>>cas validation filter</</code><code>filter-name</code><code>></code>
<code> </code><code><</code><code>filter-class</code><code>>org.jasig.cas.client.validation.cas20proxyreceivingticketvalidationfilter</</code><code>filter-class</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>casserverurlprefix</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>https://zhaoguoyu-pc/cas/</</code><code>param-value</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>proxycallbackurl</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>http://zhaoguoyu-pc:8080/mywebapp/proxycallback</</code><code>param-value</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>proxyreceptorurl</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>/proxycallback</</code><code>param-value</code><code>></code>
<code> </code><code><</code><code>filter-name</code><code>>cas httpservletrequest wrapper filter</</code><code>filter-name</code><code>></code>
<code> </code><code><</code><code>filter-class</code><code>>org.jasig.cas.client.util.httpservletrequestwrapperfilter</</code><code>filter-class</code><code>></code>
<code> </code><code><</code><code>filter-name</code><code>>cas assertion thread local filter</</code><code>filter-name</code><code>></code>
<code> </code><code><</code><code>filter-class</code><code>>org.jasig.cas.client.util.assertionthreadlocalfilter</</code><code>filter-class</code><code>></code>
<code> </code><code><!-- ************************* --></code>
<code> </code><code><filter-mapping></code>
<code> </code><code><url-pattern>/*</url-pattern></code>
<code> </code><code></filter-mapping></code>
<code> </code><code><</code><code>filter-mapping</code><code>></code>
<code> </code><code><</code><code>url-pattern</code><code>>/proxycallback</</code><code>url-pattern</code><code>></code>
<code> </code><code></</code><code>filter-mapping</code><code>></code>
<code> </code><code><</code><code>url-pattern</code><code>>/protected/*</</code><code>url-pattern</code><code>></code>
<code> </code><code><</code><code>url-pattern</code><code>>/*</</code><code>url-pattern</code><code>></code>
<code> </code><code><!-- *********************** --></code>
<code> </code><code><listener></code>
<code> </code><code><listener-class>org.jasig.cas.client.session.singlesignouthttpsessionlistener</listener-class></code>
<code> </code><code></listener></code>
<code> </code><code><</code><code>welcome-file-list</code><code>></code>
<code> </code><code><</code><code>welcome-file</code><code>>index.jsp</</code><code>welcome-file</code><code>></code>
<code> </code><code></</code><code>welcome-file-list</code><code>></code>
<code></</code><code>web-app</code><code>></code>
修改的内容如下
1.為cas20proxyreceivingticketvalidationfilter增加2個配置元素
<init-param>
<param-name>proxycallbackurl</param-name>
<param-value>http://zhaoguoyu-pc:8080/proxyclient/proxycallback</param-value>
</init-param>
<param-name>proxyreceptorurl</param-name>
<param-value>/proxycallback</param-value>
2.增加映射url(注意順序),一定要在其他filter的前面
到這兒,可以作為一個普通服務可以作為代理使用了。
3.複制改名另外一個普通應用,作為背景應用(back-end service)
修改web.xml
<code> </code><code><</code><code>filter</code><code>></code>
<code> </code><code><</code><code>filter-name</code><code>>cas validation filter</</code><code>filter-name</code><code>></code>
<code> </code><code><</code><code>filter-class</code><code>>org.jasig.cas.client.validation.cas20proxyreceivingticketvalidationfilter</</code><code>filter-class</code><code>></code>
<code> </code><code><</code><code>init-param</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>casserverurlprefix</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>https://zhaoguoyu-pc/cas/</</code><code>param-value</code><code>></code>
<code> </code><code></</code><code>init-param</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>servername</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>http://hellocas2.com:8070</</code><code>param-value</code><code>></code>
<code> </code><code><</code><code>param-name</code><code>>acceptanyproxy</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>true</</code><code>param-value</code><code>></code>
<code> </code><code></</code><code>init-param</code><code>> </code>
<code> </code><code><</code><code>init-param</code><code>> </code>
<code> </code><code><</code><code>param-name</code><code>>redirectaftervalidation</</code><code>param-name</code><code>></code>
<code> </code><code><</code><code>param-value</code><code>>false</</code><code>param-value</code><code>></code>
<code> </code><code></</code><code>init-param</code><code>> </code>
<code> </code><code></</code><code>filter</code><code>></code>
添加了acceptanyproxy 和redirectaftervalidation參數。支援接收代理
4.在proxy 應用下添加測試的servlet
5.測試驗證
前提:分别啟動cas-server,cas-proxy,cas-backend client
5.1 輸入位址,http://zhaoguoyu-pc:8080/proxyclient。
5.2 輸入使用者名和密碼
5.3 通路servlet
<a href="http://zhaoguoyu-pc:8080/proxyclient/proxytestservlet" target="_blank">http://zhaoguoyu-pc:8080/proxyclient/proxytestservlet</a>
經過确認,反悔代碼為200,和ok。表示測試通過。
如果想詳細連結關于代理模式的原理,請參考
<a href="http://my.oschina.net/ichatter/blog/129642" target="_blank">http://my.oschina.net/ichatter/blog/129642</a>
<a href="http://blog.csdn.net/emon123/article/details/6285549" target="_blank">http://blog.csdn.net/emon123/article/details/6285549</a>
<a href="http://www.blogjava.net/security/archive/2006/04/26/sso_casproxy.html" target="_blank">http://www.blogjava.net/security/archive/2006/04/26/sso_casproxy.html</a>
<a href="http://www.myexception.cn/software-architecture-design/644728.html" target="_blank">http://www.myexception.cn/software-architecture-design/644728.html</a>
<a href="http://init-life.com/web/2014/11/12/cas-workflows/" target="_blank">http://init-life.com/web/2014/11/12/cas-workflows/</a>
<a href="http://www.mytju.com/classcode/news_readnews.asp?newsid=503" target="_blank">http://www.mytju.com/classcode/news_readnews.asp?newsid=503</a>
<a href="https://wiki.jasig.org/display/casc/cas+client+for+java+3.1" target="_blank">https://wiki.jasig.org/display/casc/cas+client+for+java+3.1。</a>
部署期間,我遇到這個坑爹的異常
<cas:authenticationfailure code='service.not.authorized.proxy'>
service.not.authorized.proxy
</cas:authenticationfailure>
</cas:serviceresponse>
感覺哪兒少配了個參數,硬是搜遍了大量部落格,竟然沒找到。最後自己看源碼,一步步跟蹤出來的。