本文首先来看项目A采取 Cas server 5.3 版本搭建的认证做事器,哀求我们系统接入,并供应 cas-client3.2 版本 jar 包。
一、需求客户给了一个简要的文档,即认证集成手册,旨在辅导运用系统实现统一身份认证和单点登录集成。
各运用将认证接口的客户端开拓包集成在各运用之中,更换自身原有独立的身份认证功能,通过身份管理平台实现身份认证和单点登录过程。该接口目前涵盖的类型包括JAVA、 PHP和 .NET(2.0+),适宜于不同措辞和平台的运用程序。

CAS做事集成
认证接口事情过程
代理认证配置完后,均需至统一身份管理平台授权访问。
先登录身份认证管理平台,在认证管理的认证运用模板,添加需代理认证的运用;添加完运用后,需给相应的组或者帐号授权,许可其访问该运用。
JAVA客户端支配将“java/lib”下的cas-client-core-3.2.1.jar文件拷贝到客户端运用所在做事器中,并将存放这些jar包的路径设置到运用的classpath中。比如WebContent\WEB-INF\lib中
修正WebContent\WEB-INF\web.xml文件
<context-param>
<param-name>casServerLogoutUrl</param-name>
<param-value> http://XXX/authserver/logout </param-value>
</context-param>
<!--单点退出配置-->
<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>CAS Authentication Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value> http://192.168.1.10/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value> http://192.168.1.10:8080/index</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>
<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://192.168.1.10/cas /</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value> http://192.168.1.10:8080/index </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>/protect/</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>
二、剖析我们公司的技能框架体系,是基于 spring security + oauth2 + jwt 的开源框架,公司自己又再大略封装形成了一个框架做事,支持用户登录认证和授权和微做事之间的认证,微做事之间的做事采取 oauth2 的客户端模式 client_credentials。
上面的需求只能辅导我们理解到:
须要与Cas-server做对接,对接的cas-client为3.2.1版本.给了一个spring-mvc时期的配置示例,与springboot不兼容,须要转换为spring-boot的代码配置上面的示例是基于session和cookie作为通信的,而我们体系是jwt体系,不兼容。通过技能调研,与cas-server做对接,基于spring-security常见的对接方案为:
spring-security-cas某开源的cas-support封装jar包剖析上面2种方案,实在都是基于spring-security的封装:
自定义了一个Filter, 可以拦截要求自定义一个provider用来处理上面自定义Filter拦截的要求,从而完成与认证做事器的交互,获取用户信息,完成认证过程。我采取的是spring-security-cas,相对来说代码质量更好,可扩展性强,又是spring团队供应。
在利用spring-security-cas过程中碰着了很多问题:
spring-security-cas是基于spring-security的,必须狠理解spring-security,不然寸步难行。spring-security-cas供应了一个 CasAuthenticationFilter 过滤器和一个 CasAuthenticationProvider。公司封装了一个认证和授权的框架,作为jar包供应出来,里面定义了各种WebSecurityConfigurerAdapter,但是我又改不了。改不了框架的WebSecurityConfigurerAdapter,那就只能自定义一个WebSecurityConfigurerAdapter,自定义之后的Adapter里面有各种配置,与原来的WebSecurityConfigurerAdapter又是什么关系,实行顺序是什么样的。都须要去搞清楚,不然,怎么调试都不通。
其余一个关键,网上虽然有各种示例和事理讲解,总觉得没有我想要的答案。
下面分享我办理问题的全体过程:
弄清楚spring-security的总入口在哪里从入口出发,各种Filter是如何事情的弄清楚只有一个WebSecurityConfigurerAdapter的时候,spring-security的事情过程是怎么样的如果定义了多个WebSecurityConfigurerAdapter,他们的顺序又是怎么样的请连续关注