单点登录CAS7-客户端配置单点登录

简介: 原理这里用的是:cas-client-core-3.4.0.jar(2015-07-21发布的)下载地址为:http://mvnrepository.

原理

这里用的是:cas-client-core-3.4.0.jar(2015-07-21发布的)

下载地址为:http://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core/3.4.0

下面介绍两种配置方法:一种是纯web.xml配置,一种是借助Spring来配置,相关的官方文档如下所示

https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml

https://wiki.jasig.org/display/CASC/Configuring+the+JA-SIG+CAS+Client+for+Java+using+Spring

纯web.xml

web.xml中需配置四个顺序固定的Filter,而且出于认证考虑,最好配置在其他Filter之前,它们的先后顺序如下

  1. AuthenticationFilter
  2. TicketValidationFilter(或其它AbstractTicketValidationFilter实现,比如Cas20ProxyReceivingTicketValidationFilter)
  3. HttpServletRequestWrapperFilter
  4. AssertionThreadLocalFilter

下面分别介绍一下四个Filter的各自用途

  • AuthenticationFilter

用来拦截请求,判断是否需要CASServer认证,需要则跳转到CASServer登录页,否则放行请求

有两个必须参数:一个是指定CASServer登录地址的casServerLoginUrl,一个是指定认证成功后跳转地址的serverName或service

service和serverName设置一个即可,二者都设置时service的优先级更高(即会以service为准)

service指的是一个确切的URL,而serverName是用来指定客户端的主机名的,格式为{protocol}:{hostName}:{port}

指定serverName时,该Filter会把它附加上当前请求的URI及对应的查询参数来构造一个确切的URL作为认证成功后的跳转地址

比如serverName=”http://gg.cn”,当前请求的URI为”/oa”,查询参数为”aa=bb”,则认证成功后跳转地址为http://gg.cn/oa?aa=bb

简单来讲:casServerLoginUrl--去哪登录serverName--我是谁

  • TicketValidationFilter

请求通过AuthenticationFilter认证后,若请求中携带了ticket参数,则会由该类Filter对携带的ticket进行校验

验证ticket的时候,要访问CAS服务的/serviceValidate接口,使用的url就是${casServerUrlPrefix}/serviceValidate

所以它也有两个参数是必须指定的,casServerUrlPrefix(CASServer对应URL地址的前缀)和serverName或service

实际上,TicketValidationFilter只是对验证ticket的这一类Filter的统称,其并不对应CASClient中的具体类型

CASClient中有多种验证ticket的Filter,都继承自AbstractTicketValidationFilter

常见的有Cas10TicketValidationFilter/Cas20ProxyReceivingTicketValidationFilter/Saml11TicketValidationFilter

它们的验证逻辑都是一致的,都有AbstractTicketValidationFilter实现,只是使用的TicketValidator不一样而已

如果要从服务器获取用户名之外的更多信息应该采用CAS20这个2.0协议的代理

  • HttpServletRequestWrapperFilter

用于封装每个请求的HttpServletRequest为其内部定义的CasHttpServletRequestWrapper

它会将保存在Session或request中的Assertion对象重写HttpServletRequest的getUserPrincipal()、getRemoteUser()、isUserInRole()

这样在我们的应用中就可以非常方便的从HttpServletRequest中获取到用户的相关信息

  • AssertionThreadLocalFilter

为了方便用户在应用的其它地方获取Assertion对象,其会将当前的Assertion对象存放到当前的线程变量中

以后用户在程序的任何地方都可以从线程变量中获取当前的Assertion,而无需从Session或request中解析

该线程变量是由AssertionHolder持有的,可以通过Assertion assertion = AssertionHolder.getAssertion()获取当前Assertion

借助Spring

与上述web.xml配置四个Filter方式不同的是,可以使用Spring的四个DelegatingFilterProxy来代理需要配置的四个Filter

此时这四个Filter就应该配置为Spring的Bean对象,并且web.xml中的就应该对应SpringBean名称

但是SingleSignOutFilter/HttpServletRequestWrapperFilter/AssertionThreadLocalFilter等Filter不含配置参数

所以实际上只需要配置AuthenticationFilter和Cas20ProxyReceivingTicketValidationFilter两个Filter交由Spring代理就可以了

注意

  • CAS1.0提供的接口有/validate,CAS2.0提供的接口有/serviceValidate、/proxyValidate、/proxy

  • 四个Filter太多了,有时间的话考虑参考org.springframework.web.filter.CompositeFilter写一个Filter来实现

  • web.xml的好处是可以配置匿名访问的资源,配置参数参考AuthenticationFilter中的ignoreUrlPatternMatcherStrategyClass

   起码cas-client-core-3.4.0.jar中的Spring配置还不支持ignorePattern(该参数默认正则验证,此外还有contains和equals验证)

  • javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching casserver found

   这是由于创建证书的域名和应用中配置的CAS服务域名不一致(也就是说客户端导入的CRT证书与CAS服务端的域名不同)

代码

本文源码下载:(下面两个地址的文件的内容,都是一样的)

http://download.csdn.net/detail/jadyer/8934207

下面是web.xml的配置

 



    
        contextConfigLocation
        classpath:applicationContext.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    

    
        SpringMVC
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:applicationContext.xml
        
    
    
        SpringMVC
        /
    

    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
        
            forceEncoding
            true
        
    
    
        CharacterEncodingFilter
        /*
    

    
    
        casAuthenticationFilter
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        casAuthenticationFilter
        /*
    
    
        casTicketValidationFilter
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        casTicketValidationFilter
        /*
    
    
    
        casHttpServletRequestWrapperFilter
        org.jasig.cas.client.util.HttpServletRequestWrapperFilter
    
    
        casHttpServletRequestWrapperFilter
        /*
    
    
        casAssertionThreadLocalFilter
        org.jasig.cas.client.util.AssertionThreadLocalFilter
    
    
        casAssertionThreadLocalFilter
        /*
    

下面是/src/applicationContext.xml

 

 



    
        
        
        
            
                classpath:config.properties
            
        
    
    

    
    
        
        
    
    
        
        
            
                
            
        
    

下面是/src/config.properties

#<>
#where to login
casServerLoginUrl=http://sso.jadyer.com:8080/cas-server-web/login
#login server root
casServerUrlPrefix=http://sso.jadyer.com:8080/cas-server-web
#who am i
#casClientServerName=http://boss.jadyer.com:8180
casClientServerName=http://risk.jadyer.com:8280

最后是/WebRoot/index.jsp







客户端登录成功

测试

接下来就可以测试了,测试之前先修改几处配置,模拟单点环境

首先在C:\Windows\System32\drivers\etc\hosts中添加以下三个配置

127.0.0.1 sso.jadyer.com
127.0.0.1 boss.jadyer.com
127.0.0.1 risk.jadyer.com

 

然后拷贝三个Tomcat,分别用作sso服务器和两个sso客户端

修改两个sso客户端的\Tomcat\conf\server.xml的以下三个端口,保证启动监听端口不重复






最后修改两个sso客户端\Tomcat\webapps\cas-client\WEB-INF\classes\config.properties里面的casClientServerName的值

casClientServerName=http://boss.jadyer.com:8180
casClientServerName=http://risk.jadyer.com:8280

下面开始测试

先访问http://boss.jadyer.com:8180/cas-client,发现没登录会自动跳转到单点登录页

输入密码后登录成功

再访问http://risk.jadyer.com:8280/cas-client,会发现自动登录成功,不用再登录了

将不定期更新资源,欢迎持续关注


想获得更多的学习知识请关注微信公众号:西北码农或扫下方二维码

目录
相关文章
|
安全 Java 应用服务中间件
基于CAS实现SSO单点登录
基于CAS实现SSO单点登录
基于CAS实现SSO单点登录
|
6天前
|
安全 数据库 数据安全/隐私保护
什么是 单点登录SSO?SSO工作原理
单点登录(SSO)让用户通过一组凭证访问多个应用,简化了多平台登录流程。在没有 SSO 的情况下,用户需为每个应用单独管理用户名和密码,而 SSO 通过身份提供商(IdP)和信任的服务提供商(SP)实现统一认证。这不仅减少了用户的密码管理负担,还降低了 IT 管理员的工作量,提高了安全性和用户体验。借助如 ADSelfService Plus 等工具,企业能更轻松地实施 SSO,并结合多重身份验证(MFA)增强安全性。
|
8月前
|
存储 缓存
实现单点登录的方式
实现单点登录的方式
100 1
|
存储 安全 Java
【SSO-CAS部署】安装部署单点登录组件CAS(5.3.x版本)
【SSO-CAS部署】安装部署单点登录组件CAS(5.3.x版本)
858 0
【SSO-CAS部署】安装部署单点登录组件CAS(5.3.x版本)
|
安全 Java 应用服务中间件
基于CAS,实现SSO单点登录,很细
基于CAS,实现SSO单点登录,很细
668 0
基于CAS,实现SSO单点登录,很细
|
安全 数据安全/隐私保护 UED
什么是单点登录(SSO)?底层原理是什么?
什么是单点登录(SSO)?底层原理是什么?
459 0
|
存储 NoSQL 安全
JavaWeb - SSO单点登录原理之基于CAS(一)
JavaWeb - SSO单点登录原理之基于CAS(一)
293 0
|
缓存 网络安全
JavaWeb - SSO单点登录原理之基于CAS(二)
JavaWeb - SSO单点登录原理之基于CAS(二)
275 0
JavaWeb - SSO单点登录原理之基于CAS(二)
|
存储 SQL 安全
CAS实现单点登录
单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
324 0
CAS实现单点登录
|
安全 算法 Java
使用CAS实现单点登录
使用CAS实现单点登录
325 0
使用CAS实现单点登录