`
234390216
  • 浏览: 10232383 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462600
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775474
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398314
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395003
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679964
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530858
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183880
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467823
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151372
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68130
社区版块
存档分类
最新评论

Cas(07)——建立使用Cas进行单点登录的应用

    博客分类:
  • Cas
阅读更多

建立使用Cas进行单点登录的应用

 

目录

1.1加入cas-client-core-xxx.jarclasspath

1.2配置Filter

1.2.1AuthenticationFilter

1.2.2TicketValidationFilter

1.2.3HttpServletRequestWrapperFilter

1.2.4AssertionThreadLocalFilter

1.2.5基于SpringFilter配置

1.3添加证书到信任库

 

       根据之前的描述我们知道,Cas由两部分组成,Cas ServerCas ClientCas ServerCas自己的服务端,而Cas ClientCas客户端,其需要与我们自己的应用进行集成。

 

1.1     加入cas-client-core-xxx.jarclasspath

       在我们下载的Cas Client压缩包的modules目录下可以找到一个名为cas-client-core-xxx.jarjar文件,首先需要将该jar包加入我们应用的类路径下,笔者这里使用的是cas-client-core-3.1.11.jar。如果用户的应用是使用Maven构造的,则可以在应用的pom.xml文件中加入如下依赖。

   <dependency>

      <groupId>org.jasig.cas.client</groupId>

      <artifactId>cas-client-core</artifactId>

      <version>3.1.11</version>

   </dependency>

 

1.2     配置Filter

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

l  AuthenticationFilter

l  TicketValidationFilter

l  HttpServletRequestWrapperFilter

l  AssertionThreadLocalFilter

 

       这些Filter有的必须指定某些参数,有的可以指定某些参数,这些参数可以通过context-param来指定,也可以通过init-param来指定。Cas Client默认会先从init-param取,没取到则从context-param取,所以当init-paramcontext-param都指定了某个参数时,init-param指定的将拥有更高的优先级。所以当多个Filter需要共用一个参数时,我们可以把它定义为context-param

 

1.2.1    AuthenticationFilter

       AuthenticationFilter用来拦截所有的请求,用以判断用户是否需要通过Cas Server进行认证,如果需要则将跳转到Cas Server的登录页面。如果不需要进行登录认证,则请求会继续往下执行。

     AuthenticationFilter有两个用户必须指定的参数,一个是用来指定Cas Server登录地址的casServerLoginUrl,另一个是用来指定认证成功后需要跳转地址的serverNameserviceserviceserverName只需要指定一个就可以了。当两者都指定了,参数service将具有更高的优先级,即将以service指定的参数值为准。serviceserverName的区别在于service指定的是一个确定的URL,认证成功后就会确切的跳转到service指定的URL;而serverName则是用来指定主机名,其格式为{protocol}:{hostName}:{port},如:https://localhost:8443,当指定的是serverName时,AuthenticationFilter将会把它附加上当前请求的URI,以及对应的查询参数来构造一个确定的URL,如指定serverName为“http://localhost”,而当前请求的URI为“/app”,查询参数为“a=b&b=c”,则对应认证成功后的跳转地址将为“http://localhost/app?a=b&b=c”。

 

       除了上述必须指定的参数外,AuthenticationFilter还可以指定如下可选参数:

l  renew:当指定renewtrue时,在请Cas Server时将带上参数“renew=true”,默认为false

l  gateway:指定gatewaytrue时,在请求Cas Server时将带上参数“gateway=true”,默认为false

l  artifactParameterName:指定ticket对应的请求参数名称,默认为ticket

l  serviceParameterName:指定service对应的请求参数名称,默认为service

 

       如下是一个配置AuthenticationFilter的示例,serverName由于在接下来配置的Filter中还要用,所以利用context-param将其配置为一个公用的参数。“elim”对应我的电脑名。

 

   <context-param>

      <param-name>serverName</param-name>

      <param-value>http://elim:8080</param-value>

   </context-param>

  

   <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://elim:8443/cas/login</param-value>

      </init-param>

   </filter>

   <filter-mapping>

      <filter-name>casAuthenticationFilter</filter-name>

      <url-pattern>/*</url-pattern>

   </filter-mapping>

 

1.2.2    TicketValidationFilter

       在请求通过AuthenticationFilter的认证之后,如果请求中携带了参数ticket则将会由TicketValidationFilter来对携带的ticket进行校验。TicketValidationFilter只是对验证ticket的这一类Filter的统称,其并不对应Cas Client中的一个具体类型。Cas Client中有多种验证ticketFilter,都继承自AbstractTicketValidationFilter,它们的验证逻辑都是一致的,都有AbstractTicketValidationFilter实现,所不同的是使用的TicketValidator不一样。笔者这里将以Cas10TicketValidationFilter为例,其它还有Cas20ProxyReceivingTicketValidationFilterSaml11TicketValidationFilter

 

   <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://elim:8443/cas</param-value>

      </init-param>

   </filter>

   <filter-mapping>

      <filter-name>casTicketValidationFilter</filter-name>

      <url-pattern>/*</url-pattern>

   </filter-mapping>

 

       必须指定的参数:

l  casServerUrlPrefix:用来指定Cas Server对应URL地址的前缀,如上面示例的“https://elim:8443/cas”。

l  serverNameservice:语义跟前面介绍的一致。

 

       可选参数:

l  redirectAfterValidation :表示是否验证通过后重新跳转到该URL,但是不带参数ticket,默认为true

l  useSession :在验证ticket成功后会生成一个Assertion对象,如果useSessiontrue,则会将该对象存放到Session中。如果为false,则要求每次请求都需要携带ticket进行验证,显然useSessionfalseredirectAfterValidationtrue是冲突的。默认为true

l  exceptionOnValidationFailure :表示ticket验证失败后是否需要抛出异常,默认为true

l  renew:当值为true时将发送“renew=true”到Cas Server,默认为false

 

1.2.3    HttpServletRequestWrapperFilter

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

   <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.2.4    AssertionThreadLocalFilter

       AssertionThreadLocalFilter是为了方便用户在应用的其它地方获取Assertion对象,其会将当前的Assertion对象存放到当前的线程变量中,那么以后用户在程序的任何地方都可以从线程变量中获取当前Assertion,无需再从Sessionrequest中进行解析。该线程变量是由AssertionHolder持有的,我们在获取当前的Assertion时也只需要通过AssertionHoldergetAssertion()方法获取即可,如:

   Assertion assertion = AssertionHolder.getAssertion();

 

       AssertionThreadLocalFilter这种设计理念是非常好的,实际应用中使用的也比较多,Spring Security中也有用到这种理念。为了便于大家了解,特贴出AssertionHolder的源码如下:

public class AssertionHolder {

 

    /**

     * ThreadLocal to hold the Assertion for Threads to access.

     */

    private static final ThreadLocal threadLocal = new ThreadLocal();

 

 

    /**

     * Retrieve the assertion from the ThreadLocal.

     */

    public static Assertion getAssertion() {

        return (Assertion) threadLocal.get();

    }

 

    /**

     * Add the Assertion to the ThreadLocal.

     */

    public static void setAssertion(final Assertion assertion) {

        threadLocal.set(assertion);

    }

 

    /**

     * Clear the ThreadLocal.

     */

    public static void clear() {

        threadLocal.set(null);

    }

}

 

       以下是配置AssertionThreadLocalFilter的示例:

   <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.2.5    基于Spring的Filter配置

       使用Cas单点登录的应用需要我们在应用的web.xml文件中配置上述介绍的四个Filter,但如果用户的应用是使用Spring开发的,则我们可以只在web.xml文件中配置四个SpringDelegatingFilterProxy用来代理需要配置的四个Filter,对应的Filter名称对应我们需要代理的Spring ApplicationContextbean的名称,此时我们需要将对应的Filter配置为Spring ApplicationContext中的一个bean对象。所以此时对应的web.xml文件的定义应该是这样的:

   <filter>

      <filter-name>casAuthenticationFilter</filter-name>

     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

   </filter>

   <filter-mapping>

      <filter-name>casAuthenticationFilter</filter-name>

      <url-pattern>/*</url-pattern>

   </filter-mapping>

 

   <filter>

      <filter-name>casTicketValidationFilter</filter-name>

     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

   </filter>

   <filter-mapping>

      <filter-name>casTicketValidationFilter</filter-name>

      <url-pattern>/*</url-pattern>

   </filter-mapping>

 

   <filter>

      <filter-name>casHttpServletRequestWrapperFilter</filter-name>

     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

   </filter>

   <filter-mapping>

      <filter-name>casHttpServletRequestWrapperFilter</filter-name>

      <url-pattern>/*</url-pattern>

   </filter-mapping>

 

   <filter>

      <filter-name>casAssertionThreadLocalFilter</filter-name>

     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

   </filter>

   <filter-mapping>

      <filter-name>casAssertionThreadLocalFilter</filter-name>

      <url-pattern>/*</url-pattern>

   </filter-mapping>

 

       而对应的Filter应该都以对应的名称定义为Spring ApplicationContext中的一个bean

   <bean name="casAuthenticationFilter"

      class="org.jasig.cas.client.authentication.AuthenticationFilter"

      p:casServerLoginUrl="https://elim:8443/cas/login" p:renew="false"

      p:gateway="false" p:serverName="http://elim:8080" />

 

   <bean name="casTicketValidationFilter"

      class="org.jasig.cas.client.validation.Cas10TicketValidationFilter"

      p:serverName="http://elim:8080" p:redirectAfterValidation="true">

      <property name="ticketValidator">

         <bean class="org.jasig.cas.client.validation.Cas10TicketValidator">

            <!-- 对应于casServerUrlPrefix -->

            <constructor-arg index="0" value="https://elim:8443/cas" />

         </bean>

      </property>

   </bean>

 

   <bean id="casHttpServletRequestWrapperFilter" class="org.jasig.cas.client.util.HttpServletRequestWrapperFilter"/>

  

   <bean id="casAssertionThreadLocalFilter" class="org.jasig.cas.client.util.AssertionThreadLocalFilter"/>

 

1.3     添加证书到信任库

       ticket验证成功后,还需要验证证书,这需要我们将之前建立的证书导出并添加到当前JRE的证书信任库中,否则将验证失败。JRE在寻找证书时将根据当前使用的host来寻找,且会用该host匹配之前创建证书时指定的用户名称,如果匹配则表示找到。这也就意味着我们在创建证书时指定的用户名称需要是我们的host。我的机器名称为“elim”,我就把它作为我的host,那么对应的证书应该这样创建。

keytool -genkey -keyalg RSA -alias tomcat -dname "cn=elim" -storepass changeit

 

       该语句是对我们之前介绍的keytool -genkey -alias tomcat -keyalg RSA的精写,它已经通过相应的参数指定了对应的参数值,而不需要再与用户交互了。如果还用之前的语句生成证书的话,那么对应的值应该这样填:



 

 

       之后会在用户的对应目录下生成一个.keystore文件。之后需要将该文件导出为一个证书到%JAVA_HOME%/jre/lib/security目录下,对应指令为:

keytool -export -alias tomcat -file %JAVA_HOME%/jre/lib/security/tomcat.crt -storepass changeit

 

       之后需要将导出的tomcat.crt证书添加到运行时使用的JRE的受信任证书库中,此时如果出现异常可将原本%JAVA_HOME%/jre/lib/security目录下的cacerts删除后继续执行以下指令。

keytool -import -alias tomcat -file %JAVA_HOME%/jre/lib/security/tomcat.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

 

       经过以上几步后就可以启用我们自己的Cas Client应用了,然后初次访问该应用时就会跳转到Cas Server进行登录认证。认证成功后将跳转到我们自己的Client应用进行ticket的验证,验证通过后就可以自由的访问我们的Client应用了。

 

(注:本文是基于Cas Server3.5.2Cas Client3.1.11所写)

(注:原创文章,转载请注明出处。原文地址:http://elim.iteye.com/blog/2142631

 

 

 

  • 大小: 10.5 KB
1
0
分享到:
评论

相关推荐

    CAS单点登录,退出后ticket失效报出异常解决办法——换jar包

    CAS单点登录,退出后ticket失效报出异常解决办法——换jar包 把客户端的 casclient.jar 包换成我的这个。

    CAS单点登录系统.doc

    ### CAS单点登录系统知识点详解 #### 一、CAS简介 CAS(Central Authentication Service)是由耶鲁大学发起的一项开源项目,其目标在于为Web应用提供可靠且统一的单点登录解决方案。自2004年12月起,CAS成为了JA-...

    cas实现单点登录

    CAS单点登录的核心在于通过一个中心认证服务器管理用户的认证过程。当用户首次访问某个应用程序时,该应用程序会重定向用户到CAS服务器进行身份验证。验证成功后,CAS服务器会生成一个票据(Ticket Granting Ticket,...

    CAS单点登录.doc

    ### CAS单点登录详解 #### 一、SSO与CAS概念解析 单点登录(Single Sign-On,简称SSO)是一种先进的技术方案,主要用于解决在多应用系统环境下的用户认证问题。SSO允许用户在首次登录后,无需再次输入凭证即可访问...

    CAS单点登录,退出后ticket失效报出异常解决办法—换jar包

    CAS单点登录,退出后ticket失效报出异常解决办法——换jar包 把客户端的 casclient.jar 包换成我的这个。

    CAS单点登录CAS4.0.0+.Net Client

    CAS(Central Authentication Service)是基于Java开发的一种开放源代码的单点登录(Single Sign-On,SSO)系统,主要用于统一管理多个应用系统的用户身份验证。在这个案例中,我们讨论的是CAS 4.0.0版本的.NET...

    CAS单点登录(SSO)完整教程

    ### CAS单点登录(SSO)完整教程:深入解析与实践指南 #### 一、引言:CAS SSO的全面理解 CAS(Central Authentication Service),即中央认证服务,是由Yelu大学研发并开源的一种用于实现单点登录(SSO)的服务框架...

    CAS单点登录服务端部署包

    CAS 是 Central Authentication Service 的缩写 —— 中央认证服务,一种独立开放指令协议,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。 CAS 支持以下特性: CAS v1, ...

    Django集成CAS单点登录的方法示例

    通过以上步骤,我们可以顺利地在Django应用中集成CAS单点登录功能,从而提高应用的安全性和用户体验。CAS不仅简化了多应用间的认证流程,还增强了整体的安全性,是现代Web开发中不可或缺的一部分。

    基于Java的源码-单点登录系统 JA-SIG CAS.zip

    在本案例中,我们讨论的是基于Java实现的单点登录系统——JA-SIG CAS。这个系统是开源的,由教育高级网(Ja-Sig)开发,旨在提供一种简单而有效的解决方案,为校园环境或企业环境中的各种应用实现安全的单点登录功能...

    基于CAS集群的单点失效问题解决方案

    - **CAS集群介绍**:CAS(Central Authentication Service)是由耶鲁大学开发的一种开放源代码的单点登录系统,它支持多种认证协议,并且能够与多种应用系统进行无缝集成。尽管CAS本身已经非常成熟且可靠,但它最初...

    cas的部署规则

    - CAS服务器收到注销请求后,会从session中移除所有加入单点登录范围内的session ID,并调用各应用接口销毁session中的TGT,同时使浏览器端的TGC失效。 - 下次用户访问任何应用时,流程将重新开始。 #### 四、CAS...

    让CAS支持客户端自定义登陆页面——服务器篇.docx

    CAS作为一种广泛使用的单点登录解决方案,在提供强大认证服务的同时,也允许一定程度上的定制化需求满足,例如允许客户端自定义登录页面。 #### 修改原则 在进行此类定制化操作之前,需要明确以下几个基本原则: ...

    Android代码-CAS_SSO_Record

    CAS SSO 单点登录记录 作者:刘仁奎 个人网址 ...CAS 5.2.x 单点登录 —— 实现单点登录演示:http://v.qq.com/x/page/d063304k06a.html Cas 5.2.x 单点登录使用自定义主题 - 演示:http://v.qq.com/x/pag

    ASP.NET源码——[交友会员]轻量级单点登录系统源码.zip

    单点登录(Single Sign-On,SSO)是一种身份验证机制,它允许用户在一个应用系统中登录后,无须再次认证即可访问其他相互信任的系统。在SSO系统中,通常有一个中央认证服务(CAS),负责处理用户的登录请求,并向...

    统一身份认证-CAS配置实现

    4. **应用服务端**:需要集成CAS单点登录功能的应用系统。 5. **客户端**:指最终用户通过浏览器等方式访问应用服务端。 ##### 配置实现 下面以Tomcat为例,介绍如何配置CAS实现单点登录。 1. **修改配置**:...

    单点登录1

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统上登录后,无需再次认证即可访问多个相互信任的系统。它简化了用户在多个应用之间切换时的身份验证流程,提高了用户体验并降低了...

    SSO单点登录解决方案

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次进行身份验证。这个过程提高了用户体验,同时也简化了安全管理。在本文中,我们将深入探讨SSO的工作...

    单点登录(SSO)-同域名、不同域名

    单点登录是一种身份验证机制,它允许用户通过一次认证过程来访问多个应用系统。这一过程不仅提升了用户体验,同时也增强了安全性。SSO系统通常包含以下几个关键组件: - **SSO服务器**:负责用户的认证过程,并维护...

    单点登录实

    ### 单点登录实现详解——CAS客户端与服务器端配置 #### 一、引言 单点登录(Single Sign-On,简称SSO)是一种常见的身份...此外,对于开发者来说,掌握这些基本的操作对于后续开发维护CAS单点登录系统具有重要意义。

Global site tag (gtag.js) - Google Analytics