cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)

最近一直在研究cas登录中心这一块的应用,分享一下记录的一些笔记和心得。后面会把cas-server端的配置和重构,另外还有这几天再搞nginx+cas的https反向代理配置,以及cas的证书相关的知识分享出来。

Cas由两部分组成,Cas Server和Cas Client。Cas Server是Cas自己的服务端,而Cas Client是Cas客户端,往往客户端需要和我们具体的业务系统进行集成,这里我们主要详述cas 客户端的配置以及实例

第一步:

我们得有一个现成的web项目,然后我们要加入cas-client-core-xxx.jar到classpath;

maven项目用这个:

<dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-core</artifactId><version>3.3.3</version>
</dependency>

这里我使用 cas-client-core-3.3.3.jar,顺便推荐一个用来搜索和下载引用包的网站,我一般从这里下载引用包:http://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core/3.3.3


第二步:配置单点登录Filter和注销监听器/过滤器

 我们需要在应用的web.xml文件中配置四个Filter,这四个Filter必须按照固定的顺序来进行配置,而且它们必须配置在应用的其它Filter之前。它们的先后顺序要求如下:
1、AuthenticationFilter
2、TicketValidationFilter
3、HttpServletRequestWrapperFilter
4、AssertionThreadLocalFilter

1.1、 配置AuthenticationFilter

 1.1.1、AuthenticationFilter有两个必须指定的参数:

casServerLoginUrl用来指定Cas Server登录地址serverName或service用来指定认证成功后需要跳转地址。

补充:

service和serverName一般只需要指定一个,如果都指定了,参数service将具有更高的优先级,即以service指定的参数值为准。

service和serverName的区别:

service指定的是一个确定的URL,认证成功后就会确切的跳转到service指定的URL;

serverName用来指定主机名,格式为{http/https}:{主机名}:{端口号}

如:https://localhost:8335,当指定的是serverName时,AuthenticationFilter将会把它附加上当前请求的URI,以及对应的查询参数来构造一个确定的URL,如指定serverName为“http://localhost”,而当前请求的URI为“/login”,查询参数为“user=123&pwd=123”,则对应认证成功后的跳转地址将为“http://localhost/login?user=123&pwd=123”。)

 AuthenticationFilter可以指定如下可选参数:
renew:当指定renew为true时,在请Cas Server时将带上参数“renew=true”,默认为false。
gateway:指定gateway为true时,在请求Cas Server时将带上参数“gateway=true”,默认为false。
artifactParameterName:指定ticket对应的请求参数名称,默认为ticket。
serviceParameterName:指定service对应的请求参数名称,默认为service。


例如,我是这样配置的:

<filter><filter-name>casAuthenticationFilter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>https://cas.eguid.cn:8335/cas-server/</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://sso.eguid.cn:8080/</param-value></init-param></filter><filter-mapping><filter-name>casAuthenticationFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>


1.2、配置TicketValidationFilter

请求通过AuthenticationFilter的认证之后,如果请求中携带了参数ticket则将会由TicketValidationFilter来对携带的ticket进行校验。

TicketValidationFilter只是对验证ticket的这一类Filter的统称,其并不对应Cas Client中的一个具体类型。

Cas Client中有多种验证ticket的Filter,都继承自AbstractTicketValidationFilter,它们的验证逻辑都是一致的,都有AbstractTicketValidationFilter实现,不同的是使用的TicketValidator不一样。这里我们使用Cas10TicketValidationFilter,也可以使用Cas20ProxyReceivingTicketValidationFilter或者Saml11TicketValidationFilter。

<filter><filter-name>casTicketValidationFilter</filter-name><filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>https://cas.eguid.cn:8335/cas-server/</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://sso.eguid.cn:8080/</param-value></init-param></filter><filter-mapping><filter-name>casTicketValidationFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

必须指定的参数:

casServerUrlPrefix 用来指定Cas Server对应URL地址的前缀,如上面示例的“https://cas.eguid.cn:8335/cas-server
serverName或service:与前面的用法相同。

  

可选参数:
redirectAfterValidation :表示是否验证通过后重新跳转到该URL,但是不带参数ticket,默认为true。
useSession :                在验证ticket成功后会生成一个Assertion对象,如果useSession为true,则会将该对象存放到Session中。如果为false,则要求每次请求都需要携带ticket进行验证,显然useSession为false跟redirectAfterValidation为true是冲突的。默认为true。
exceptionOnValidationFailure :表示ticket验证失败后是否需要抛出异常,默认为true。
renew:                         当值为true时将发送“renew=true”到Cas Server,默认为false。
 
1.3、配置HttpServletRequestWrapperFilter

 HttpServletRequestWrapperFilter用于将每一个请求对应的HttpServletRequest封装为其内部定义的CasHttpServletRequestWrapper,该封装类将利用之前保存在Session或request中的Assertion对象重写HttpServletRequest的getUserPrincipal()、getRemoteUser()和isUserInRole()方法。这样在我们的应用中就可以非常方便的从HttpServletRequest中获取到用户的相关信息。

 <filter><filter-name>casHttpServletRequestWrapperFilter</filter-name><filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>casHttpServletRequestWrapperFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

1.4、配置AssertionThreadLocalFilter

 AssertionThreadLocalFilter可以在应用的其它地方获取Assertion对象,找个过滤器会把Assertion对象存放到当前的线程变量中,我们在程序的任何地方都可以从线程变量中获取当前Assertion,就不需要再从Session或request中进行解析了。这个线程变量是由AssertionHolder持有的,我们在获取当前的Assertion时也只需要通过AssertionHolder的getAssertion()方法获取即可,如:
   Assertion assertion = AssertionHolder.getAssertion();

我是这样配置的:

<filter><filter-name>casAssertionThreadLocalFilter</filter-name><filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class></filter><filter-mapping><filter-name>casAssertionThreadLocalFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

1.5、配置单点注销监听器和过滤器用于统一注销

<!-- 单点注销监听器 -->
<listener>  
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
</listener> 
<!-- 单点注销过滤器 -->
<filter><filter-name>caslogoutFilter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping><filter-name>caslogoutFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>



当你真的登录成功后,你会发现,你回不到原来页面了!怎么办?其实我们只要在前端给他一个参数就行了,可以这样简单实现这个功能:

//登录中心url
var loginCenter = "https://cas.eguid.cn:8335/cas-server";
function getUrl() {var hostname = location.href;return hostname;
}
//登陆
function login() {location.href = loginCenter + "/login?service=" + getUrl();
}
//登录中心执行登出操作
function logoutServ()
{alert("开始登出");var loginUrl = loginCenter + "/login?service=" + getUrl();location.href = loginCenter + "/logout?service=" + loginUrl;
}
在页面上的你得有登录和退出两个按钮,分别调用login()和logoutServ()方法。

其实这里还有个小问题,就是虽然你在cas-server端注销了,你会发现它依然会认为你现在是登录状态,所以没有拦截你的请求。

这是因为它时基于session验证的,你的server端session已经注销了,但是客户端应用这里的session还没有注销

一般我们会使用共享session的方法解决这个问题,另外有个简单的方法就是你可以在后台写个用来注销当前用户session的接口。




转载于:https://www.cnblogs.com/eguid/p/10195648.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

open 端口打开Linux,linux – nmap显示打开的端口,但netstat没有

如果我使用nmap扫描我的服务器,则表明已打开21端口.但是当我登录到这个服务器并运行netstat时,我什么也看不见.$nmap -sT serverStarting Nmap 4.76 ( http://nmap.org ) at 2009-06-24 11:54 MSDInteresting ports on server (x.x.x.x):Not shown: 994 filtered portsPORT STA…

技能学习重要的古语_学习方法:最重要的开发人员技能

技能学习重要的古语by Preethi Kasireddy通过Preethi Kasireddy 学习方法&#xff1a;最重要的开发人员技能 (Learning How to Learn: The Most Important Developer Skill) Being an efficient learner is at least as important as being an efficient coder.成为高效的学习…

Git submodule 的笔记

这次不造轮子&#xff0c;写写文章。file最近想把自己的 blog 整理到 github 上&#xff0c;但由于其中依赖了一些主题以及插件&#xff0c;这时候 git submodule 就能很好的处理这种情况了。 submodule 是什么&#xff1f; submodule 顾名思义&#xff0c;子模块。在一个项目依…

Leetcode690.Employee Importance员工的重要性

给定一个保存员工信息的数据结构&#xff0c;它包含了员工唯一的id&#xff0c;重要度 和 直系下属的id。 比如&#xff0c;员工1是员工2的领导&#xff0c;员工2是员工3的领导。他们相应的重要度为15, 10, 5。那么员工1的数据结构是[1, 15, [2]]&#xff0c;员工2的数据结构是…

linux进程管理类命令大全,Linux进程管理类命令

一、htop命令选项-d #&#xff1a;指定延迟时间间隔&#xff1b;-u UserName&#xff1a;仅显示指定用户的进程&#xff1b;-s COLUME&#xff1a;以指定字段进行排序&#xff1b;子命令&#xff1a;l&#xff1a;显示选定的进程打开的文件列表&#xff1b;s&#xff1a;跟踪选…

C#操作Excel

1.System.Data.DataTable连接数据库 ExcelFile 是excel的完整路径//OleDbConnection conExcel new OleDbConnection("ProviderMicrosoft.Jet.OLEDB.4.0;Data Source" ExcelFile ";Extended PropertiesExcel 8.0");//if (conExcel.State ConnectionStat…

android抓包工具——使用fiddler4在安卓手机抓包

Fiddler是一款非常流行并且实用的http抓包工具&#xff0c;它的原理是在本机开启了一个http的代理服务器&#xff0c;然后它会转发所有的http请求和响应&#xff0c;因此&#xff0c;它比一般的firebug或者是chrome自带的抓包工具要好用的多。不仅如此&#xff0c;它还可以支持…

rust风化速度_反驳《Golang、Rust的执行速度的对照,让人大吃一惊。》——不会别瞎说...

首先我无意引战&#xff0c;但是今天看到某位同学的文章里有某些错误&#xff0c;不得不指正一下。1. 测量时间的时候我们使用 std::time::SystemTime::elapsed 即可&#xff0c;不必蹩脚的使用两个 system 输出出来还得手动算一下。(当然你说对Rust不熟也就无所谓了)2. 最重要…

css flexbox模型_代码简介:CSS Flexbox有点像旅行

css flexbox模型Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事&#xff1a; CSS Flexbox explained by road tripping across the country: 7 minute read CSS Flexbox在全国各地的旅途中进行了解释&#…

Sharepoint 2013设置customErrors

原文地址&#xff1a;http://www.cnblogs.com/renzh/archive/2013/03/05/2944309.html#3407239 一、首先设置IIS中的Web.config文件 找到对应的IIS应用程序目录&#xff0c;如&#xff1a;C:\inetpub\wwwroot\wss\VirtualDirectories\3000 在此文件夹下包含一个web.config文件&…

ddt数据驱动

数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰ddt.ddt 3.case前加修饰ddt.data() 4.运行后用例会自动加载成三个单独的用例 5.测试结果&#xff1a; Testing started at 21:51 ...start!{username: selenium\xe7\xbe\xa4, psw: 232607095}end!start!{username…

http协议报文体_HTTP报文基本概念学习

HTTP是什么HTTP是HyperText Transfer Protocol的缩写,中文就是超文本传输协议,所谓的超,是个学术用语,是基于某种事物增加了更多的信息维度,比如超像素xxx之类的.协议是什么,协议说白了就是约定,约定就是模板,就是表格,就和你去银行办手续一样,客户不知道要提供什么信息,银行又…

yeoman_使用yeoman轻松创建Yeoman生成器

yeomanby Krist Wongsuphasawat克里斯特旺苏帕萨瓦(Krist Wongsuphasawat) 使用yeoman轻松创建Yeoman生成器 (Creating Yeoman generators easily with yeoman-easily) I’ve used Yeoman to start many of my projects. It’s an amazing web scaffolding tool.我已经用Yeoma…

linux 轻量化图形界面,YOXIOS 入门教程--基于Linux的 轻量化GUI图形系统和硬件平台(41页)-原创力文档...

YOXIOS --基于 Linux 的轻量化 GUI图形系统和硬件平台YOXIOS 入门教程基于 Linux 的 轻量化 GUI图形系统和硬件平台(V1.0 2020-05)提示&#xff1a;阅读此文档需要有一定的单片机开发、C/C编程语言、和使用 IDE开发工具的基础YOXIOS (C) 2020 游芯科技第 1 页 共 41 页YOXIOS -…

第一阶段 XHTML.定位样式

一位初学php的随堂笔记&#xff0c;记录自己的成长&#xff01; 1.清除浮动 (1)格式 clear:both清除两边|left清除左边 right清除右边 高度塌陷:父元素中的子元素都浮动&#xff0c;而父元素 没有设置高&#xff0c;那父元素的高为0 &#xff08;2&#xff09;万能清除(在父元素…

Canvas入门06-线段与像素边界

我们知道&#xff0c;使用以下2个API可以绘制一条线段&#xff1a; moveTo(x, y) 向当前路径中增加一条子路径&#xff0c;该子路径只包含一个点&#xff0c;此为线段的起始点lineTo(x, y) 将线段的下一个点加入子路径中context.strokeStyle rgb(200, 200, 0); context.lineWi…

函数表达书-读书笔记

定义函数的方式有两种&#xff1a;一种是函数声明&#xff0c;另一种就是函数表达式。函数声明的语法如下&#xff1a; function functionName(arg0,arg1,arg2){//函数体 } 函数声明&#xff0c;有一个重要特征就是函数声明提升。也就是在执行代码之前会先读取函数声明&#xf…

vue截取一个字符串_vue 截取字符串

let str abcdef;// 0str str.slice(0);//返回整个字符串 abcdefstr str.substring(0);//返回整个字符串 abcdefstr str.substr(0);//返回整个字符串 abcdef// 使用一个参数str str.slice(2);//截取第二个之后所有的字符 cdefstr str.substring(2);//截取第二个之后所有的…

网络工程师需要哪些知识_成长工程师可以教给我们哪些工程知识

网络工程师需要哪些知识I’ve been working as an engineer on the growth team at Airbnb for a couple of months now.我已经在Airbnb的成长团队担任工程师几个月了。 Since I’m in an environment full of passionate developers, I wanted to share some of the good eng…