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