目录
同花顺
我们自己的客户端集成Cas单点登录,由于我们的系统已有登录功能及安全框架,所以我们要j集成安全框架与Cas。
不管是客户端是什么架构,集成Cas的原理都是一样的,利用cas-client中的过滤器。
所以我们的操作,整体归类为三步:
1、引依赖(加入jar包)
2、自定义配置类(配置web.xml文件)
3、安全框架集成Cas(修改认证过滤器)
注意:
不同版本的cas-client对应着不同的配置。比如3.6.2版本中存在Cas30ServiceTicketValidator。
如果你使用了cas-client3.2.1,但是配置时引入了Cas30ServiceTicketValidator,就会报错。
所以web.xml中的过滤器,不是说从网上找一份就能拿来用的,要跟自己引入cas-client包的版本对应上,最好的办法就是自己看一下你引入的过滤器或者其他类在包中的位置。
Web项目
1、加入jar包
2、配置web.xml文件
在web.xml中一共引入了五个组件。
单点登出监听器
单点登出过滤器
认证过滤器
校验过滤器
获取用户登录名过滤器
这几个过滤器中,最重要的是认证过滤器。
认证过滤器的作用为:
当你在浏览器中输入你客户端的地址,访问客户端时,判断你是否已经单点登录,如果未登录,则重定向到Cas认证界面。
常见错误:
如果你输入你客户端的地址,localhost:8020,它就是不重定向到Cas认证界面,说明没有进入认证过滤器,没有进入后台。你要确定你的地址中带不带项目名,比如localhost:8020/abc/abc。
根据你项目真正路径,来确定认证过滤器如何配置,所要拦截保护的是哪些资源。
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 实现单点登出功能 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 负责用户的认证工作 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://localhost:8080/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8010</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/* </url-pattern>
</filter-mapping>
<!-- 负责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>http://localhost:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8010</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、修改客户端过滤器
看你原来的安全框架中,校验用户是否登录的过滤器时如何判断的。
常用的安全框架比如,shiro与springsecurity,都具备认证过滤器,即登录过滤器。
修改一下这个过滤器的判断逻辑,可以将框架里的过滤器拎出来修改,也可以自定义一个。
使用下边这个方法可以获取当前登录用户名。
String username = request.getUserPrincipal().toString();
使用这个方法的前提是在web.xml中配置HttpServletRequestWrapperFilter。
前后端分离项目
前后端分离项目,相比于Web项目,具有一定的复杂度。
Web项目,加入jar包,配置配置,就可以单点登录了,但是前后端分离项目不是,前端为一个项目,后端为一个项目,他们不在一个服务器上, cookie不可以共享。
Cas是基于Session的认证系统,通过下边这张图,我们可以看到:
后端与Cas-Server是有交互的,但是前端没有,所以你进不去前端。
1、统一前后端、cas-server
一般情况下,我们都是访问前端项目来访问客户端的,但是集成Cas后,就不可以通过访问前端项目这种方法来访问客户端了。
Cas-client的jar包是添加在后台的,所以访问前端项目是不可能跳转到Cas认证界面,
你可能想到在认证过滤器的url-partern中写前端的地址,这样它就可以跳转到Cas认证界面了,认证成功后,返回前端界面。
这种思路有两点否认:
1、认证过滤器中Service-Url的作用在于,后端与cas-server形成一套联系,访问后端的请求,经过认证过滤器判断一下是否已登录,决定是否拦截或者重定向。
你将service-url写成了前端地址,那么认证的请求去哪里判断。
2、不一定能进去,因为前端可能会有判断cookie的存在。
不经过后台的逻辑,仅仅通过Cas的过滤器进不去前端项目。
所以我们要做的就是经过后端接口,由后端接口重定向到前端页面。可以是一个loginCas登录接口也可以在后端增加一个loginCas.jsp页面。
这个接口或者页面的作用在于:
建立后端与前端的联系。
Wid前端项目后端项目都在8010端口下,用了一个tomcat,cookie共享。
正常的前后端分离项目端口不同,使用了不同的服务器,这种情况下要将已有jessionid给前端项目,前端项目才能正常进行。
具体的使用情况还是看前后端分离项目的登录逻辑怎么写的,有的可能前端使用一个cookie后端使用一个session,使用不同方式来判断登录状态。
2、不可以直接返回到前端
难点分析:
通过Cas的流程我们可以知道。
1、 cas-server认证之后,将ST与TGC返回浏览器。
2、 浏览器访问客户端子系统 。
(注意:这里是客户端子系统,是后端,而不是前端)
3、 客户端子系统带着ST与TGC一起去cas-server进行校验。
只有经过cas-client中的过滤器,才能去cas-server校验,才能成功登录。
所以说,你的service参数地址,必须要进入后端,经过cas-client的过滤器。
不可以直接返回到前端
由后端重定向至前端,才是正确的解决方案。
如果重定向到前端还是未认证状态,说明使用的不是同一个session,将jessionId返回给前端即可。
如果还是不行,前后端登录结构的原因,判断一下前端项目是否对登录逻辑有所判断,前端有可能独立的加了一层判断。
3、单点登出功能
在一个客户端登出之后,所有的客户端都应该进不去了。
Cas自带登出接口:
http://localhost:8080/cas/logout
方法一:
客户端退出之后,要销毁TGT及session。
Cas-Server中没有了TGT,任何一个客户端来校验都不会通过。
在退出接口,销毁session及重定向Cas登出接口即可。
方法二:
最简单的方法:
前端JS跳转一下http://localhost:8080/cas/logout。
SpringBoot项目
Springboot与Cas集成,有三种依赖包。
1、cas-client-autoconfig
Cas自动配置,引入后,不需要自定义Cas配置类了。
如图,包里有定义好的。
1、引依赖。
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>2.3.0-GA</version>
</dependency>
2、application.properties文件增加配置。
cas.server-url-prefix=http://localhost:8080/cas
cas.server-login-url= http://localhost:8080/cas /login
cas.client-host-url=http://localhost:8020
cas.validation-type=CAS3
3、启动类上增加注解@EnableCasClient。
Github地址:
https://github.com/Unicon/cas-client-autoconfig-support
2、cas-client-core
原装的cas-client,需要自己写Cas配置类。
1、引依赖。
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.5.1</version>
</dependency>
2、CasConfigProp配置属性类与CasConfig配置类。
CasConfigProp.java文件用于Cas-Client的属性配置,提供给application.properties与CasConfig.java使用。
CasConfig将web.xml中的过滤器全部替换为JavaBean。
代码就不上了,太多了。
3、application.properties文件
根据CasConfigProp定义的前缀名在application.properties文件中指定cas-server,cas-client地址。
3、spring-security-cas-client
SpringSecurity是一个大的安全框架,Cas的认证过滤器校验过滤器相较于SpringSecurity都是小东西。
所以SpringSecurity(大)集成Cas客户端(小),Cas的过滤器融入到安全框架中。
1、引依赖。
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas-client</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
2、CasSecurityConfig配置类。
将Cas的过滤器放入,随后在原来的SpringSecurity的基础上增加几个过滤器。
3、application.properties文件。
注意前缀名,使用在第二步中定义的前缀。