CAS Client 3.2.1 配置详解

摘要:
CAS作为一个开源单点登录框架//Wiki.jasig.org/display/CASC已经非常流行。一个完整的单点登录方案分为两部分。将不讨论如何配置CASserverCASserver,也不需要证书。5.修改用户访问配置(CAS支持关系数据库。CAS框架的优点之一是其客户端对应用系统的入侵较小。CAS身份验证过滤器<
CAS Client 3.2.1 配置详解

http://www.pinhuba.com/casclient/101256.htm

摘要: CAS作为开源的单点登陆框架已经非常的流行了。由于它对已有系统的入侵性小,支持的语言多,备受广大开发者关注;

CAS作为开源的单点登陆框架已经非常的流行了。由于它对已有系统的入侵性小,支持的语言多,备受广大开发者关注;也是很多公司将之作为单点登陆的首选框架。关于CAS如何搭建的文章,网上已经非常多了,随便搜搜都一大堆。我也就不再写些重复的东西了,但是网上的东西有时候常常是不全,或版本问题搞的很多人都很迷糊。我曾经也很迷糊,如果刚接触CAS,请你继续往下看;如果你是CAS高手,请指正我说错的地方。

CAS最早是耶鲁大学开发的(CAS2.0以前的版本),后来开源出来由JASIG来继续开发(CAS2.0以后的版本)。所以,当你准备那某一片文章上手练习的时候请分清版本。个人建议还是阅读JASIG官方文档比较好。https://wiki.jasig.org/display/CASC

一个完整的单点登陆方案分两部分

CAS server

CAS server如何配置就不多说了,基本的步骤就是

1. 下载CAS server包

2. 配置Tomcat的Https访问设置

3. 部署CAS server,其实就是将.war文件拷贝到Tomcat目录下

4. 生成证书(可以买,也可以使用自签名证书,或者干脆就用http协议,那就不需要证书了)

5. 修改用户访问配置(CAS支持关系数据库,LDAP等多种数据存储)

CAS client

CAS client是部署在应用端的,因为通常单点登陆都会涉及到对已有系统的改造。所以,client端的侵入性就变的很重要。侵入性越小,越容易部署和测试。CAS框架的优点之一就在于它的client端对应用系统的侵入性比较小。对于Java的Web项目来说,你只需要在web.xml里面添加一个filter,拷贝CAS client的jar包到应用系统,然后改造登陆认证过程即可。如果CAS server用的是Https,那就还需要将证书导入到JVM的可信证书域中,通常是($JAVA_HOME/lib/security/cacerts)。

所有的一切看着都挺简单的,但实际部署中你会遇到各式各样的问题。有很多问题网上都有人解答,这里我就记录一下我遇到的一个没找到答案的问题?

现象:

当你配置完CAS server, 也部署了CAS client后。用https登陆CAS server也都没问题时,而你无论如何都无法在登陆后跳转到你期待的页面。尽管一切看起来都配置对了,证书也导了,https也配了,filter也加了。但是还是不停的抛CAS ticket validation expection, CAS server no response错误。

解决方案:

请检查你的client是否把4个filter都配置全了,并且顺序要对。

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
<!-- CAS SSO -->
   <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://cas-server:8443/cas/login</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>
       <init-param>
           <param-name>serverName</param-name>
           <param-value>http://client-host: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>https://cas-server:8443/cas/</param-value>
       </init-param>
       <init-param>
           <param-name>serverName</param-name>
           <param-value>http://client-host:8080</param-value>
       </init-param>
       <init-param>
           <param-name>useSession</param-name>
           <param-value>true</param-value>
       </init-param>
       <init-param>
           <param-name>redirectAfterValidation</param-name>
           <param-value>true</param-value>
       </init-param>
   </filter>
   <filter>
       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
       <filter-class>
           org.jasig.cas.client.util.HttpServletRequestWrapperFilter
       </filter-class>
   </filter>
   <filter>
       <filter-name>CAS Assertion Thread Local Filter</filter-name>
       <filter-class>
           org.jasig.cas.client.util.AssertionThreadLocalFilter
       </filter-class>
   </filter>
   <filter-mapping>
       <filter-name>CAS Authentication Filter</filter-name>
       <url-pattern>/sso/*</url-pattern>
   </filter-mapping>
   <filter-mapping>
       <filter-name>CAS Validation Filter</filter-name>
       <url-pattern>/sso/*</url-pattern>
   </filter-mapping>
   <filter-mapping>
       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
       <url-pattern>/sso/*</url-pattern>
   </filter-mapping>
   <filter-mapping>
       <filter-name>CAS Assertion Thread Local Filter</filter-name>
       <url-pattern>/sso/*</url-pattern>
   </filter-mapping>

官方文档特别说明这4个Filter是必须的

1
The correct order of the filters in web.xml is necessary:

AuthenticationFilter

TicketValidationFilter (whichever one is chosen)

HttpServletRequestWrapperFilter

AssertionThreadLocalFilter

这里我要说明一下为什么这4个filter是必须要配的。

AuthenticationFilter的作用是用于拦截SSO登陆请求的,当你提交的request符合SSO登陆规则,CAS client会通过这个filter将登陆请求转向到CAS server的登陆界面。因为这是第一步,所以它要在最上面。

TicketValidationFilter的作用是用于拦截登陆返回的跳转请求的。当CAS server确认登陆用户名密码后,会返回一个server ticket,这个ticket会由应用服务器上的CAS client再送回CAS server进行验证,用于防止仿冒攻击的。

HttpServletRequestWrapperFilter的目的是将CAS server返回的信息封装到Http request里面,这样客户端就可以用request.getRemoteUser()来获取用户名等信息了。

AssertionThreadLocalFilter的作用是用于前端程序(通常是前端脚本程序)访问,因为这个时候你无法通过request来获取信息。

所以如果这4个filter不配置正确,就会报各种错误。

免责声明:文章转载自《CAS Client 3.2.1 配置详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[SAP ABAP开发技术总结]动态语句、动态程序C语言身份证信息查询系统(修改版)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【多线程】无锁编程以及CAS

无锁编程 / lock-free / 非阻塞同步 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。 实现非阻塞同步的方案称为“无锁编程算法”( Non-blocking algorithm)。 lock-free是目前最常见的...

vue项目在nginx中不能刷新问题

修改nginx配置文件为 server { listen 80; server_name www.vue.com; root html/xxx/dist/; client_max_body_size 500m; #图片路径拦截,定位到图片静态资源 location / { try_file...

js数组循环的时间复杂度

const a = [] for (i = 0; i < 100000; i++) { a.push({ id: i, name: 'xx' + i }) } const b = [] for (let i = 0; i < 100; i++) { b...

maven filters 和 resource

1 filter 1.1 用途 对多个配置文件进行选择。 1.2 选择的依据 1.3 使用的方式 第一,在<resource>标签下面加<filtering>标签,并且<filtering>标签的值设置为true; 第二,添加<filters>标签,添加<filter>,并且值中使用env变量 第...

记consul集群和spring cloud集成遇到的问题。

前两天想在线上的consul组成一个集群,但只有两台机器,两台机器无法抵御一台机器失效,至少三台(https://www.consul.io/docs/internals/consensus.html#deployment-table)。但两台机器consul起来时是没有报错的,从 server:8500/ui/上看服务也确实加入到了集群。但线上由gate...

Java笔记(十五) 并发包

并发包Java中还有一套并发工具包,位于包java.util.concurrent下,里面包括很多易用 且很多高性能的并发开发工具。 一、原子变量和CAS 为什么需要原子变量,因为对于例如count++这种操作,使用 synchronized成本太高了。Java并发包的基本原子变量有: AtomicBoolean、AtomicInteger、AtomitL...