JAVA CAS单点登录之二:CAS普通模式1演练

简介:

最主要的是先把整个一套认证流程走下来,至于完善的工作,都是没个点的工作了,相对比较简单。

主要内容

   1. 新建一个web应用mywebapp1,测试与CAS服务器的认证效果

    2.如果上一步骤1认证成功的话,将mywebapp1复制一份,调整若干参数,继续测试。

    如果步骤1,步骤2都认证成功的话,则表示环境搭建成功

具体参数  

涉及的所有参数都在我的实体机(WIN7)完成的。分别按照了3个TOMCAT服务端。

  • Tomcat6.0.36

  • JDK7

  • CAS Server版本:cas-server-3.5.3

  • CAS Client版本:cas-client-3.1.1


域名映射(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文件效果

wKioL1buWuKCYUEjAABUmzEWA3Y345.png

其中未提到的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

wKioL1buYrTDud5ZAACOLOGqia8787.png

spacer.gif

3.6.2 输入用户名和密码(test/test),进行认证,跳转到

http://zhaoguoyu-pc:8080/app01/protected/?ticket=ST-7-x6Txage1j1plr45vhHeN-cas01.example.org

wKioL1buYtiydIScAAAcKf7bY58855.png

发现后缀有了ticket. 成功实现了跳转。mywebapp1验证通过


spacer.gif3.7复制mywebapp1 为mywebapp2

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,如需转载请自行联系原作者

相关文章
|
5天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
10 0
|
5天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
21 0
|
7天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
98 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
12天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
22 4
|
15天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
17天前
|
Java 开发者 UED
Java 异步和事件驱动编程:探索响应式模式
【4月更文挑战第27天】在现代软件开发中,异步和事件驱动编程是提高应用性能和响应性的关键策略。Java 提供了多种机制来支持这些编程模式,使开发者能够构建高效、可扩展的应用程序。
30 4
|
17天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
37 2
|
17天前
|
人工智能 监控 数据可视化
Java智慧工地云平台源码带APP SaaS模式 支持私有化部署和云部署
智慧工地是指应用智能技术和互联网手段对施工现场进行管理和监控的一种工地管理模式。它利用传感器、监控摄像头、人工智能、大数据等技术,实现对施工现场的实时监测、数据分析和智能决策,以提高工地的安全性、效率和质量(技术架构:微服务+Java+Spring Cloud +UniApp +MySql)。
38 4
|
19天前
|
人工智能 监控 安全
JAVA基于SaaS模式的智慧工地云平台源码(云智慧工地解决方案)
智慧工地支持多端展示(PC端、手机端、平板端)SaaS微服务架构,项目监管端,工地管理端源码
22 0
|
20天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式