cas 代理认证配置

注:本文转自http://www.ichatter.net/2013/03/21/385/

CAS(Central Authentication
Service)框架是一个开源的单点登陆框架。最近公司要将几个产品实现单点登陆,同事在负责技术筛选时选择了CAS,并已实现了单点登陆功能,但是在配置代理功能时,遇到了诸多问题,目前虽然代理勉强可用,但问题重重,比如系统A在后台需要访问系统B的功能,在此情景中,系统A就相当于代理应用,而系统B是被代理的应用。

问题如下: 
1.系统A作为代理,不能向被代理应用系统B发送POST方式的HTTP请求。
2.系统A向系统B发送GET请求时,不能以URL附加的方式传参数(形如
 
 http://myhost.com:8080/myapp?name=abc),只能以RESTFUL风格传参数(形如:http://myhost.com:8080/myapp/abc)。
3.测试期间,应用服务器重启后,偶尔出现系统A代理失效的情况,此时需要注销用户,重新登陆。
如上种种,极大地限制了CAS单点登陆的灵活性及稳定性。据了解,同事在实现代理功能时,稍微走了偏门。

其大概实现方式如下:

1.在CAS验证服务器后台用户表中增加一个字段castgc,当用户验证通过时,可用于保存cookie数据tgc(Ticket Granting
Cookie)。
2.当用户浏览器访问系统A时,被重定向至CAS服务器进行验证,正确输入帐密后通过验证,服务器后台保存castgc字段值至用户表中,同时CAS客户端系统A将此castgc保存至session中,以备代理时使用。
3.系统A以代理身份访问系统B时,会从session中取出castgc,放入请求头(request.setHeader(“Cookie”,castgc);)。然后系统B接收到此请求,会拿着此Cookie到CAS服务器验证,验证通过后,便重定向至系统B,让其响应代理即系统A,整个请求处理即告完成。

OK,回到主题,我将借鉴网上的部分资料并以最接近官方的方式和最少的配置实现CAS代理功能。在开始之前,我们先给本地机器做些小小的改动,找到本地系统中的文件C:\WINDOWS\system32\drivers\etc\hosts,在末尾加上:

?





1

2

3

4

5

###########

127.0.0.1
cas-server.test.com

127.0.0.1
cas-client1.test.com

127.0.0.1
cas-client2.test.com

###########

  

目的是为了让我们便于区别cas服务端与各个客户端的url,同时加深理解。

开始步骤如下:

1.下载CAS服务端和客户端的最新版本:

?





1

2

CAS服务端:http://downloads.jasig.org/cas/cas-server-3.5.2-release.zip

CAS客户端:http://downloads.jasig.org/cas-clients/cas-client-3.2.1-release.zip

  

2.部署服务端: 
首先将它们全部解压。先看服务端,解压后的目录中找到cas-server-3.5.2\modules\cas-server-webapp-3.5.2.war,这就是打包后的服务端程序,把它拷出来重命名为cas-server,直接丢进tomcat中就可以在运行时被自动解压并访问了。(注意访问的URL,就是前面配置过的) 由于本文不使用https方式访问,为了使http方式的单点登陆功能生效,必须对工程中的文件\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml做一点修改,将其中的p:cookieSecure=”true”改为p:cookieSecure=”false”,即可实现http单点登陆。但还要再配置\WEB-INF\deployerConfigContext.xml,在

?





1

2

3

<bean

    class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"

    p:httpClient-ref="httpClient"
/>

  

中增一个属性 p:requireSecure=”false”,否则后面的代理票据无法生成,也就无法实现代理功能。

3.构建客户端工程cas-client1:

客户端的工程也很简单,用eclipse创建一个Dynamic Web
Project,命名为cas-client1,然后做点改动。
a.将解压后目录中的\cas-client-3.2.1\modules\cas-client-core-3.2.1.jar拷到cas-client1工程的lib目录下。
b.将官方的4个filter拷到工程的web.xml文件中,参考官方文档:https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml,并自己加上对应的filter-mapping(完整配置见文后示例),并将其中的所有filter配置中init-param对应的url进行相应的修改,如:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<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>http://cas-server.test.com:8080/cas-server/login</param-value>

    </init-param>

    <init-param>

        <param-name>serverName</param-name>

        <param-value>http://cas-client1.test.com:8080</param-value>

    </init-param>

</filter>

<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://cas-server.test.com:8080/cas-server/</param-value>

    </init-param>

    <init-param>

        <param-name>serverName</param-name>

        <param-value>http://cas-client1.test.com:8080</param-value>

    </init-param>

</filter>

  

其中要注意的是,官方声明:Proxy Authentication If you are
using proxy validation
, you should map the validation
filter before the authentication
filter.也就是说前面配置的4个filter,其中validation filter必须在authentication
filter之前先被映射。如下:

?





1

2

3

4

5

6

7

8

<filter-mapping>

    <filter-name>CAS Validation Filter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

<filter-mapping>

    <filter-name>CAS Authentication Filter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

  

c.如上是官方文档中的配置,除此之外,我们要实现代理,还要在validation filter中加入两个参数,如下:

?





1

2

3

4

5

6

7

8

<init-param>

    <param-name>proxyCallbackUrl</param-name><br>        <!-- <span style="color: rgb(255, 0, 0);"> 特别注意,此地址必须是能从单点登录服务器访问到的地址,因为单点服务器会回调此URL</span>  -->

    <param-value>http://cas-client1.test.com:8080/cas-client1/proxyCallback</param-value>

</init-param>

<init-param>

    <param-name>proxyReceptorUrl</param-name>

    <param-value>/proxyCallback</param-value>

</init-param>

  

加入filter-mapping供后面的被代理应用cas-client2回调时使用,如下:

?





1

2

3

4

<filter-mapping>

    <filter-name>CAS Validation Filter</filter-name>

    <url-pattern>/proxyCallback</url-pattern>

</filter-mapping>

  

d.写一个自定义的servlet,并配置到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

public class HelloWorldExample extends
HttpServlet {

    private
static final long serialVersionUID = 1L;

    @Override

    public
void doGet(HttpServletRequest request, HttpServletResponse response)

            throws
IOException, ServletException {

        // ........

        HttpSession session = request.getSession();

        final
Assertion assertion = (Assertion) (session == null
? request

                .getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION) : session

                .getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION));

        // 被代理应用的URL

        String serviceUrl = "http://cas-client2.test.com:8080/cas-client2/HelloWorldExample";

        final
String proxyTicket = assertion.getPrincipal().getProxyTicketFor(

                serviceUrl);

        URL url = new
URL(serviceUrl + "?ticket="
+ proxyTicket);// 不需要cookie,只需传入代理票据

        HttpURLConnection conn = null;

        conn = (HttpURLConnection) url.openConnection();

        // conn.setRequestMethod("POST");//使用POST方式

        conn.setDoOutput(true);

        OutputStreamWriter osw = new
OutputStreamWriter(conn.getOutputStream(),

                "UTF-8");

        osw.write("name=阿J小虫abc");// 传参

        osw.close();

        // 业务处理

        // ........

    }

}

  

web.xml加入如下:

?





1

2

3

4

5

6

7

8

9

<!-- my filter -->

<servlet>

    <servlet-name>HelloWorldExample</servlet-name>

    <servlet-class>HelloWorldExample</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>HelloWorldExample</servlet-name>

    <url-pattern>/HelloWorldExample</url-pattern>

</servlet-mapping>

  

到此为止,我们的第一个客户端工程cas-client1构建完毕,将它与cas-server一起部署到tomcat并运行,即可看到单点登陆的效果(用户名和密码相同即可通过验证)。


 4.构建客户端工程cas-client2:
将cas-client1复制出来重命名为cas-client2。具体来讲,作为被代理应用,它主要是用来从cas-client1获取请求参数name=阿J小虫,然后响应代理(输出数据)。
代码块如下:

?





1

2

3

4

5

6

String name = request.getParameter("name");

if
(name != null)

    System.out

            .println(new
String(name.getBytes("iso-8859-1"), "utf-8"));

PrintWriter out = response.getWriter();

out.print("congratulation!you got it from cas-client2!");

  

另外,被代理应用也可以作为第三个客户端的代理应用,但在此不作考虑,所以可以注释掉validation
filter中的参数proxyCallbackUrl和proxyReceptorUrl,并加入另外两个参数redirectAfterValidation和acceptAnyProxy,如下:

?





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

<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://cas-server.test.com:8080/cas-server/</param-value>

    </init-param>

    <init-param>

        <param-name>serverName</param-name>

        <param-value>http://cas-client2.test.com:8080</param-value>

    </init-param>

        <!-- <init-param>

            <param-name>proxyCallbackUrl</param-name>

            <param-value>http://cas-client2.test.com:8080/cas-client2/proxyCallback            </param-value>

        </init-param>

            <init-param>

            <param-name>proxyReceptorUrl</param-name>

            <param-value>/proxyCallback</param-value>

    </init-param> -->

    <init-param>

        <!-- redirectAfterValidation must be false, otherwise the request params

            from proxying app could not be received -->

        <param-name>redirectAfterValidation</param-name>

        <param-value>false</param-value>

    </init-param>

    <init-param>

        <param-name>acceptAnyProxy</param-name>

        <param-value>true</param-value>

    </init-param>

</filter>

  

最后记得将拷过来的web.xml文件中的相关url改成与cas-client2对应的。与cas-server和cas-client1一同部署,登陆cas-client1代理程序时,后台成功实现对cas-client2的访问并获取返回数据。

注意事项:

1.当用eclipse进行调试时,如把断点设置在获取响应之前,可能会出现异常,如下:

?





1

2

3

4

三月 21, 2013
3:00:30
下午

org.jasig.cas.client.validation.AbstractTicketValidationFilter doFilter

WARNING: org.jasig.cas.client.validation.TicketValidationException:

未能够识别出目标 ‘ST-2-cMeR2w5xzryNeSuh3jx9-cas01.example.org‘票根

  

一开始我也以为票根有问题,此时,只要取消断点重新登陆一下就能顺利响应了,至于为什么设置断点就报错,可能是网络的响应被断点中断从而延时了导致的。

2.被代理应用cas-client2中的validation
filter参数redirectAfterValidation必须设置为false,否则接收不到代理传过来的请求参数,如name=阿J小虫。还有参数acceptAnyProxy与allowedProxyChains二选一,如果配置acceptAnyProxy,必须为true,本文示例使用此参数。

时间: 2024-11-08 21:54:47

cas 代理认证配置的相关文章

jfinal集成cas单点认证实践

本示例jfinal集成cas单点认证,采用获取到登录用户session信息后,在本地站点备份一份session信息,主要做以下几个步骤: 1.站点引入响应jar包: 2.在web.xml中配置对应过滤器: 3.增加拦截handler,并在jfinal的config中配置. 此次示例在handler中获取登录用户session,并设置本站点session. 详细介绍如下: 1.引入jar包 需要引入两个jar包:cas-client-core-3.2.2.jar和commons-logging-1

CAS单点登录配置

无https验证的CAS单点登录配置 一.下载开发环境 CAS服务器:cas-server-3.4.10-release.zip CAS客户端:cas-client-3.2.1-release.zip 二.部署CAS服务器 解压cas-server-3.4.10-release.zip将modules目录下的cas-server-webapp-3.4.10.war改名称为cas.war复制到tomcat的webapps下,启动tomcat,访问:http://localhost:8080/cas

Nginx做为CDN缓存负载均衡代理的配置实现

系统架构: nginx+tomcat+mysql 本文只做Nginx做为CDN缓存负载均衡代理的配置实现的介绍 相关软件: nginx-1.8.1.tar.gz ngx_cache_purge-2.3.tar.gz (用于手动清理缓存) 一.nginx安装 [[email protected] ~]tar -xf nginx-1.8.1.tar.gz [[email protected] ~]tar -xf ngx_cache_purge-2.3.tar.gz -C /usr/local/ngx

Nginx反向代理的配置

Chapter: Nginx基本操作释疑 1. Nginx的端口修改问题 2. Nginx 301重定向的配置 3. Windows下配置Nginx使之支持PHP 4. Linux下配置Nginx使之支持PHP 5. 以源码编译的方式安装PHP与php-fpm 6. Nginx多站点配置的一次实践 7. Nginx反向代理的配置 Nginx 作为 web 服务器一个重要的功能就是反向代理.其实我们在前面的一篇文章<Nginx多站点配置的一次实践>里,用的就是 Nginx 的反向代理,这里简单再

自定义PAC文件实现代理自动配置

首先了解什么是PAC文件,点击了解详情. 在了解了PAC文件之后,那么后面的事情就比较简单了. 按照规范编写出适合自己的PAC文件,让网络更为自由(作为开发人员已被逼上不归路了)! 需要的朋友点击下载(下载完后打开文件修改对应的端口值) 代理工具集点击下载 下面以GoAgentX为例说明使用方法: 选择完后,记得点击下面的"Restart PAC Server"按钮进行立即生效: 选择适当的模式: 一般下图的网络配置是自动配置的: 自定义PAC文件实现代理自动配置,布布扣,bubuko

代理自动配置脚本

iefile://d:/PersonalSet/agent.pac火狐file:///d:/PersonalSet/agent.pac function FindProxyForURL(url, host){ if (isPlainHostName(host)) {     return "DIRECT"; } if (isInNet(host, "10.0.0.0", "255.0.0.0")) {     return "DIREC

APACHE + LDAP 的权限认证配置方法

原文地址:http://www.chinaunix.net/jh/49/627646.html一.前言     很多朋友希望利用 Apache 通过 LDAP 进行用户认证及权限管理.     通过多次试验,总结出以下方法,与大家共享.          配置思路:对用户通过"组(groups)"进行管理,对于需要权限控制的目录,     则通过"组"进行控制.     参考:         http://www.moocky.net/Manual/apache/

ubuntu squid 代理服务器安装配置

安装: 下载安装包 http://pan.baidu.com/s/1mitvwpE 解压 tar -xzvf file.tar.gz 编译: 进入sbin目录  执行 ./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-gnuregex --enable-icmp --enable-snmp --enable-default-err-language="Simplify_Chinese" --enable-k

Hadoop 2.4.1 登录认证配置小结

1.简单模式 这种模式,配置简单,使用简单. core-site.xml添加 <property> <name>hadoop.security.authorization</name> <value>true</value> </property> <property> <name>hadoop.security.authentication</name> <value>simple&l