【问题标题】:Redirect loop with Grails Spring Security CAS plugin使用 Grails Spring Security CAS 插件重定向循环
【发布时间】:2014-01-21 19:19:44
【问题描述】:

我正在处理一个涉及 CAS 服务器的项目,它与使用单点登录 (SSO) 的其他基于 Spring 的项目一起工作,但我收到了一个涉及 Grails spring-security-cas 插件的重定向循环(版本:“:spring -security-cas:2.0-RC1")。我看过plugin's documentation。我知道 CAS 重定向问题似乎很常见,但我还没有找到与这种情况相关的帖子。我是 Grails 和 CAS 领域的新手,所以提前感谢您在正确方向上的任何推动。

访问 grails 应用程序上的安全页面最初会正确重定向到 CAS 服务器登录页面,并使用适当的服务参数:https://example.com:8443/cas/login?service=http://example.com :8080/grailsapp/j_spring_cas_security_check

问题发生在用户登录成功,CAS 重定向回服务后。 grails 应用程序中的 j_spring_cas_security_check 正在重定向回https://example.com:8443/cas 登录页面,该页面看到 TGC 并重定向回服务 j_spring_cas_security_check 页面,该页面无限重定向 [直到浏览器给出重定向循环错误]。看起来每次迭代都会创建新的服务票证。

我的 Config.groovy 有:

grails.plugin.springsecurity.cas.loginUri = /login
grails.plugin.springsecurity.cas.serviceUrl = http://example.com:8080/grailsapp/j_spring_cas_security_check
grails.plugin.springsecurity.cas.serverUrlPrefix = https://example.com:8443/cas
# we aren't using cas with proxy
# logout details not shown here

根据其他问题/答案已经尝试过不成功的尝试:

  • 我认为问题不在于 CAS 服务器:当我直接转到另一个已经使用 CAS 的项目时,它们会检测到票证 cookie 并正常登录,而无需用户再次进行身份验证。
  • SSL 证书是自签名的,并且已添加到 Java 的 cacert 存储中。不会发生 SSLHandshake 或与证书相关的异常等。
  • 这不是像 question 19710841 这样的错误凭据或代理情况,但我尝试将 /j_spring_cas_security_check 添加到 Annotation staticRules 中,但得到了相同的循环。

cas 服务器的日志包括:

=============================================================
WHO: [username: sampleuser]
WHAT: supplied credentials: [username: sampleuser]
ACTION: AUTHENTICATION_SUCCESS
APPLICATION: CAS
WHEN: Fri Jan 03 23:52:41 GMT 2014
CLIENT IP ADDRESS: XXX.XXX.XXX.XXX
SERVER IP ADDRESS: example.com
=============================================================
=============================================================
WHO: [username: sampleuser]
WHAT: TGT-24-Rttmt5i5raWcV1Z5wZavVopigQc4xeIckEUfMKdG3EwEzI3LUI-cas.service
ACTION: TICKET_GRANTING_TICKET_CREATED
APPLICATION: CAS
WHEN: Fri Jan 03 23:52:41 GMT 2014
CLIENT IP ADDRESS: XXX.XXX.XXX.XXX
SERVER IP ADDRESS: example.com
=============================================================

INFO [org.jasig.cas.CentralAuthenticationServiceImpl] - <Granted service ticket [ST-77-cneJOIwmnoOdKqkscaiy-cas.service] for service [http://example.com:8080/grailsapp/j_spring_cas_security_check] for user [sampleuser]>

####### FIRST ITERATION OF LOOP BELOW #############

=============================================================
WHO: sampleuser
WHAT: ST-77-cneJOIwmnoOdKqkscaiy-cas.service for http://example.com:8080/grailsapp/j_spring_cas_security_check
ACTION: SERVICE_TICKET_CREATED
APPLICATION: CAS
WHEN: Fri Jan 03 23:52:41 GMT 2014
CLIENT IP ADDRESS: XXX.XXX.XXX.XXX
SERVER IP ADDRESS: example.com
=============================================================
=============================================================
WHO: audit:unknown
WHAT: ST-77-cneJOIwmnoOdKqkscaiy-cas.service
ACTION: SERVICE_TICKET_VALIDATED
APPLICATION: CAS
WHEN: Fri Jan 03 23:52:41 GMT 2014
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: example.com
=============================================================

DEBUG [org.jasig.cas.web.flow.InitialFlowSetupAction] - <Placing service in FlowScope: http://example.com:8080/grailsapp/j_spring_cas_security_check>
INFO [org.jasig.cas.CentralAuthenticationServiceImpl] - <Granted service ticket [ST-78-6qsbaVNNOess4VhGOQE4-cas.service] for service [http://example.com:8080/grailsapp/j_spring_cas_security_check] for user [sampleuser]>

####### SERVICE_TICKET_CREATED and SERVICE_TICKET_VALIDATED LOOP CONTINUES A FEW MORE TIMES BEFORE BROWSER GIVES UP #############

【问题讨论】:

    标签: grails redirect spring-security single-sign-on cas


    【解决方案1】:

    除了覆盖UserDetailsService之外,我还必须在Config.groovy中配置filterProcessesUrl

    grails.plugin.springsecurity.cas.filterProcessesUrl = "/user/login" // same as uri part of serviceUrl
    grails.plugin.springsecurity.cas.serviceUrl = "http://yoursite.com/user/login"
    

    让 CasAuthenticationFilter 在 CAS 身份验证后启动。以下是源代码参考链接:

    您还可以查看CasAuthenticationFilter.java 的来源,参见serviceTicketRequestsuper.requiresAuthentication 方法。

    【讨论】:

      【解决方案2】:

      问题是在 Grails 客户端中我没有创建 userDetailsS​​ervice。我在 Grails 的服务文件夹中实现了一个自定义类(参见 http://grails-plugins.github.io/grails-spring-security-core/guide/userDetailsService.html):

      public class MyUserDetailsService implements UserDetailsService {
          // Required methods here
      }
      

      然后在 resources.groovy 中引用了这个:

      beans = {
          userDetailsService(MyUserDetailsService)
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-10
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 2021-02-03
        • 2012-01-15
        • 2015-04-22
        • 2015-11-22
        相关资源
        最近更新 更多