使用 CAS + Spring Security 实现 SSO

Posted

技术标签:

【中文标题】使用 CAS + Spring Security 实现 SSO【英文标题】:Implement SSO using CAS + Spring Security 【发布时间】:2011-03-17 20:05:11 【问题描述】:

我正在尝试使用 CAS 和 Spring Security 在多个 Web 应用程序中实现 SSO。预期案例: CAS - http://localhost:8080/cas/ 应用 A 受保护的内容 - http://localhost:8081/cas-client1/secure/index.html 应用 B 受保护的内容 - http://localhost:8081/cas-client2/secure/index.html

1) 用户访问cas-client1时,会提示CAS登录表单并触发认证。 2)同一个用户访问cas-client2,以前的登录应该可以识别,不会提示登录表单

但是,我未能执行第 2 步。CAS 登录表单仍然提示用户,因此需要双重登录。我的 Spring Security 配置中是否有任何错误设置:

  <security:http entry-point-ref="casAuthenticationEntryPoint" auto-config="true">
    <security:intercept-url pattern="/secure/**" access="ROLE_USER" />
    <security:custom-filter position="CAS_FILTER" ref="casAuthenticationFilter" />
  </security:http>

  <bean id="casAuthenticationEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
    <property name="loginUrl" value="http://localhost:8080/cas/login" />
    <property name="serviceProperties" ref="serviceProperties" />
  </bean>

  <bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
    <!-- http://localhost:8081/cas-client2 for app 2-->
    <property name="service" value="http://localhost:8081/cas-client1/j_spring_cas_security_check" />
  </bean>

  <security:authentication-manager alias="authenticationManager">
    <security:authentication-provider ref="casAuthenticationProvider" />
  </security:authentication-manager>

  <bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="authenticationFailureHandler">
      <bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
        <property name="defaultFailureUrl" value="/casfailed.jsp" />
      </bean>
    </property>
  </bean>

  <bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
    <property name="userDetailsService" ref="userService" />
    <property name="serviceProperties"  ref="serviceProperties" />
    <property name="ticketValidator">
      <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
        <constructor-arg index="0" value="http://localhost:8080/cas" />
      </bean>
    </property>
    <property name="key" value="an_id_for_this_auth_provider_only" />
  </bean>

  <security:user-service id="userService">
    <security:user name="wilson" password="wilson" authorities="ROLE_USER" />
  </security:user-service>

【问题讨论】:

【参考方案1】:

问题终于解决了。我的 CAS 正在使用 HTTP,因此需要将安全 cookie 设置为 false。

修改ticketGrantingTicketCookieGenerator.xml

p:cookieSecure="false"

【讨论】:

很高兴知道测试,但我认为每个人都应该在 https- 上运行它 谢谢!一年多前,我第一次偶然发现了这个答案,然后再次开始深入研究 CAS。在 QA 环境中可能存在问题的另一个参数是 p:cookieDomain。如果生产和 QA 的域不同,则需要调整或完全删除此设置。删除 p:cookieDomain 并设置 p:cookieSecure="false" 是在 QA 中启动和运行 CAS 最宽松的设置。

以上是关于使用 CAS + Spring Security 实现 SSO的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 和 CAS 单点注销

Grails Spring Security 和 CAS 问题

spring security+cas(cas proxy配置)

Spring Security - CAS 自定义到 LDAP 集成

Spring-security-cas 插件单点注销不起作用

在带有 CAS 和 LDAP 的 Grails 中使用 Spring Security