问:Grails2.4、CAS和臭名昭著的重定向循环

问:Grails2.4、CAS和臭名昭著的重定向循环,grails,spring-security,cas,Grails,Spring Security,Cas,我有几个Grails应用程序在生产环境中运行,并通过spring security和Grails CAS插件与CAS服务器CAS 3.3.5进行接口。这些应用程序受Grails 1.3.7版到2.2.4版的各种版本的支持 我正在将其中一个迁移到2.4.4,并且我在身份验证方面一直存在问题。在练习的最后,我有一个臭名昭著的问题:这个网页在Chrome中有一个重定向循环。在服务器端,我有通常的!错误: ERROR [org.jasig.cas.web.ServiceValidateControlle

我有几个Grails应用程序在生产环境中运行,并通过spring security和Grails CAS插件与CAS服务器CAS 3.3.5进行接口。这些应用程序受Grails 1.3.7版到2.2.4版的各种版本的支持

我正在将其中一个迁移到2.4.4,并且我在身份验证方面一直存在问题。在练习的最后,我有一个臭名昭著的问题:这个网页在Chrome中有一个重定向循环。在服务器端,我有通常的!错误:

ERROR [org.jasig.cas.web.ServiceValidateController] - <TicketException
generating ticket for: [callbackUrl:
https://casclient.mydomain.com:9043/testCas/secure/receptor]>
org.jasig.cas.ticket.InvalidTicketException
    at org.jasig.cas.CentralAuthenticationServiceImpl.delegateTicketGrantingTicket(CentralAuthenticationServiceImpl.java:268)
此时,如果启动应用程序,我可以访问页面showSecurePage而不会出现问题。让我们继续安装CAS插件

在BuildConfig.groovy的插件代码段中添加以下字符串:

compile ":spring-security-core:2.0-RC4"
compile ":spring-security-cas:2.0-RC1"
在依赖项代码段中:

    mavenRepo 'http://repo.spring.io/milestone'
执行grailsclean和grailscompile

运行:grails s2快速启动testCas用户角色

Config.groovy已被修改,必须进行调优

因为我们不使用注释,所以我将s2 quickstart添加的条目替换为:

grails.plugin.springsecurity.rejectIfNoRule = true
grails.plugin.springsecurity.securityConfigType = "InterceptUrlMap"
grails.plugin.springsecurity.interceptUrlMap = [
    '/':                  ['permitAll'],
    '/index':             ['permitAll'],
    '/index.gsp':         ['permitAll'],
    '/**/js/**':          ['permitAll'],
    '/**/css/**':         ['permitAll'],
    '/**/images/**':      ['permitAll'],
    '/**/favicon.ico':    ['permitAll'],
    '/login/**':          ['permitAll'],
    '/logout/**':         ['permitAll'],
    '/secure/receptor':   ['permitAll'],
    '/showSecure/**':     ['isFullyAuthenticated()'],
    '/finance/**':        ['ROLE_FINANCE', 'isFullyAuthenticated()']
]
注意:我已将permitAll添加到/secure/receptor,如中所述

最后,我们添加了CAS配置。如文件所述,必须定义所有列出的参数:

grails.serverURL = "http://casclient.mydomain.com:9080/testCas"
grails.serverSecureURL = "https://casclient.mydomain.com:9043/testCas"
grails.plugin.springsecurity.useCAS = true
grails.plugin.springsecurity.cas.active = true
grails.plugin.springsecurity.cas.serverUrlPrefix = 'https://casserver.mydomain.com:10443/sso'
grails.plugin.springsecurity.cas.serverUrlEncoding = 'UTF-8'
grails.plugin.springsecurity.cas.loginUri = '/login'
grails.plugin.springsecurity.cas.sendRenew = false
grails.plugin.springsecurity.cas.serviceUrl = "${grails.serverURL}/secure/security_check"
grails.plugin.springsecurity.cas.key ='authentication_provider'
grails.plugin.springsecurity.cas.artifactParameter = 'ticket'
grails.plugin.springsecurity.cas.serviceParameter = 'service'
grails.plugin.springsecurity.cas.filterProcessesUrl = '/secure/security_check'
grails.plugin.springsecurity.cas.proxyCallbackUrl = "${grails.serverSecureURL}/secure/receptor"
grails.plugin.springsecurity.cas.proxyReceptorUrl = '/secure/receptor'
grails.plugin.springsecurity.cas.useSingleSignOut = true

grails.plugin.springsecurity.logoutURL = "${grails.plugin.springsecurity.cas.serverUrlPrefix}/logout"
grails.plugin.springsecurity.logout.afterLogoutUrl = "${grails.plugin.springsecurity.cas.serverUrlPrefix}/logout?url=${grails.serverURL}"
注意:如果在grails.plugin.springsecurity.cas.proxyCallbackUrl中,我将链接定义为http而不是https,那么在cas服务器端,我将有一个循环,其中包含一条错误的凭据消息。添加安全链接时,此错误将消失

现在进入安全页面,我看到了通常的CAS登录。如果我正确登录,我会在CAS日志中看到重定向循环错误:

-------------------------2015-03-31 13:33:33,736 ERROR
[org.jasig.cas.web.ServiceValidateController] - <TicketException
generating ticket for: [callbackUrl:
https://casclient.mydomain.com:9043/testCas/secure/receptor]>
org.jasig.cas.ticket.InvalidTicketException
    at org.jasig.cas.CentralAuthenticationServiceImpl.delegateTicketGrantingTicket(CentralAuthenticationServiceImpl.java:268)
    at org.jasig.cas.web.ServiceValidateController.handleRequestInternal(ServiceValidateController.java:126)
我实现了resources.groovy中定义的服务:

// Place your Spring DSL code here
beans = {

    userDetailsService(EsoUserDetailsService)
}
问题消失了。 不过我还有一个。 如果在EsoUserDetails服务中,我尝试以以下方式从数据库检索角色:

User.withTransaction { status ->
            User user = User.findByUsername(username)
            if (!user) throw new UsernameNotFoundException('User not found', username)

            def authorities = user.authorities.collect { new GrantedAuthorityImpl(it.authority)
            }

            return new EsoUserDetails(user.username, user.password, user.enabled,
            !user.accountExpired, !user.passwordExpired, !user.accountLocked, authorities,
            user.id, user.getUserRealName())
        }
我有一个错误:


类[eso.phase3.rm.User]上的方法在Grails应用程序外部使用。如果在使用模拟API或引导Grails的测试环境中正确运行。

请检查以下答案:为cas插件设置proxyCallbackUrl时,将导致许多此类错误。除非您在cas上使用proxyValidate,否则不应将pgtUrl发送到serviceValidate。不,我没有使用proxyValidate,我已注释掉您在其他答案cas.proxyCallbackUrl和cas.proxyReceptorUrl中提到的两行,实际上我在cas日志中不再看到错误。不幸的是,重定向循环仍然存在。按照您提到的链接,我可以读到:问题是我使用了CAS服务器的旧依赖项,而我使用的是最新的CAS客户端依赖项。我正在使用cas插件spring security cas:2.0-RC1对抗cas服务器3.3.5我编辑了这篇文章。这是个问题吗?我在文档中找不到任何特定内容。显然,这是一个授权问题,而不是身份验证问题。
// Place your Spring DSL code here
beans = {

    userDetailsService(EsoUserDetailsService)
}
User.withTransaction { status ->
            User user = User.findByUsername(username)
            if (!user) throw new UsernameNotFoundException('User not found', username)

            def authorities = user.authorities.collect { new GrantedAuthorityImpl(it.authority)
            }

            return new EsoUserDetails(user.username, user.password, user.enabled,
            !user.accountExpired, !user.passwordExpired, !user.accountLocked, authorities,
            user.id, user.getUserRealName())
        }