当我们把单点系统搭建好了,或者客户已经提供好了单点登录服务,往往会想,如何集成cas、如何能在业务系统上用cas(本章只讲cas协议,oauth2、SAML等后续)
但情况往往是这样的:
而需求一般都是这样的:
上述说得简单,但我们的使用时还是有一定的复杂度,例如:
但这博文很简单,完成两个目标:
当然除了这些还可以集成jetty、tomcat等等
cas client如何强大方便,都是遵循着cas协议进行认证,否则是不能完成工作的。
客户端地址:http://localhost:8080/sample
cas服务地址:https://passport.com
协议流程:
1. 若业务系统未登录,302到https://passport.com?service=http://localhost:8080/sample
2. 用户提交用户名密码后,302到http://localhost:8080/sample?ticket=ABC123
3. 业务系统验证ticket,并获取用户数据,https://passport.com/p3/serviceValidate?service=p3/serviceValidate?service&ticket=ABC123
4. 成功获取用户数据
其实我们只关心两个阶段,其他都交给cas client去完成:
1. 请求的路径是否需要跳转到登录页
2. 回来的用户是否能访问被请求资源
那么可想而知,肯定会有两个filter,其中包括:
1. AuthenticationFilter(用于判断请求是否需要跳转到login及鉴权)
2. CallbackFilter(用于cas回调用作校验ticket以及获取用户数据鉴权后302到第一次请求的url)
3. LogoutFilter(退出时作单点退出)
上面说得非常啰嗦,下面马上来实战~
查看CasClient官网Demo
直接看web.xml,最核心也是这个文件:
<web-app 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">
<filter>
<filter-name>CAS Single Sign Out Filterfilter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class>
<init-param>
<param-name>casServerUrlPrefixparam-name>
<param-value>https://localhost:8443/casparam-value>
init-param>
filter>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListenerlistener-class>
listener>
<filter>
<filter-name>CAS Authentication Filterfilter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>
<init-param>
<param-name>casServerLoginUrlparam-name>
<param-value>https://localhost:8443/cas/loginparam-value>
init-param>
<init-param>
<param-name>serverNameparam-name>
<param-value>http://localhost:8080/sampleparam-value>
init-param>
filter>
<filter>
<filter-name>CAS Validation Filterfilter-name>
<filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilterfilter-class>
<init-param>
<param-name>casServerUrlPrefixparam-name>
<param-value>https://localhost:8443/casparam-value>
init-param>
<init-param>
<param-name>serverNameparam-name>
<param-value>http://localhost:8080/sampleparam-value>
init-param>
<init-param>
<param-name>redirectAfterValidationparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>useSessionparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilterfilter-class>
filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter-mapping>
<filter-name>CAS Authentication Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<welcome-file-list>
<welcome-file>
index.jsp
welcome-file>
welcome-file-list>
web-app>
以上的核心点有两个:
但上面的配置非常的简单,除了被排除
的所有路径都会跳转进行登录
再加一个需求,判断路径是否需要跳转到登录页再跳转,那么不得不介绍一下AuthenticationFilter
的一些简单配置:
属性名 | 类型 | 备注 | 默认值 | 是否必须 |
---|---|---|---|---|
casServerUrlPrefix | string | cas服务路径 | 必须 | |
serverName | string | 客户端访问路径 | 必须 | |
renew | boolean | 验证成功是否新创建会话 | true | 非必须 |
service | string | 服务路径 | 非必须 | |
ignorePattern | string | 忽略登录路径正则表达式 | 非必须 | |
ignoreUrlPatternType | string | 忽略路径表达式类型(可以配置实现UrlPatternMatcherStrategy类路径) | 非必须 |
好的,我们试试新增zhangsan.jsp(允许不登录)、wangwu.jsp必须登录
然后在实现UrlPatternMatcherStrategy
进行判断
SimpleUrlPatternMatcherStrategy.java
/*
* 版权所有.(c)2008-2017. 卡尔科技工作室
*/
package com.carl.auth.sso.client.demo;
import org.jasig.cas.client.authentication.UrlPatternMatcherStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Carl
* @date 2017/9/28
* @since 1.5.0
*/
public class SimpleUrlPatternMatcherStrategy implements UrlPatternMatcherStrategy {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public boolean matches(String url) {
logger.debug("访问路径:" + url);
return url.contains("zhangsan.jsp");
}
@Override
public void setPattern(String pattern) {
}
}
认证过滤器配置调整:
<filter>
<filter-name>CAS Authentication Filterfilter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>
<init-param>
<param-name>casServerLoginUrlparam-name>
<param-value>https://passport.sso.com:8443/cas/loginparam-value>
init-param>
<init-param>
<param-name>serverNameparam-name>
<param-value>http://localhost:8080param-value>
init-param>
<init-param>
<param-name>ignoreUrlPatternTypeparam-name>
<param-value>com.carl.auth.sso.client.demo.SimpleUrlPatternMatcherStrategyparam-value>
init-param>
<init-param>
<param-name>ignorePatternparam-name>
<param-value>.*param-value>
init-param>
filter>
尝试访问:http://localhost:8080/sample/zhangsan.jsp 不会转发到登录页
而:http://localhost:8080/sample/wangwu.jsp 会转发到登录页
本章讲解了cas-client如何使用,但我们实际上远远比这要复杂,当然我们这个demo也作为入门了解阶段学习,但目标很明确,要了解cas的整个转发过程
下一章内容比较多,会说常用shiro的集成,所以必须具备这章的知
下载代码尝试: 其他版本可以到GitHub或者码云查看
具体模块路径:sso-client-demo/sso-cas-client-demo
发现一些意外的事情可以考虑翻翻前面的博客进行学习哦
如果技术的交流或者疑问可以联系或者提出issue。
QQ: 756884434 (请注明:SSO-CSDN)