我们有一个使用Spring Security Core和Spring Security CAS插件的Grails 3.3.2应用程序。使用自定义的userDetailsService类可从Oracle数据库获取用户信息。在访问部署了该应用程序实例的tomcat服务器的内部URL时,此应用程序通过CAS登录就很好,但是当尝试通过负载均衡器访问该应用程序时,我们会遇到重定向循环和错误。
这是设置。 我们有两个实例;一个配置为直接在应用服务器上访问,另一个配置为通过充当反向代理的负载平衡器访问。直接访问服务器上的服务器可以正常工作(重定向到CAS,您登录,CAS重定向回,然后您就可以进入)。通过负载平衡器的那个重定向到CAS,您登录,CAS重定向您,凭据正确传递,但是随后Groovy中的某些内容将其匿名化,您将获得访问被拒绝,然后循环回到CAS。但是CAS票证是有效的,因此CAS会将您发送回去,并且循环重复。 在浏览器确定有错误并停止之前,它会重复5或6次。
在将日志记录设置为“调试”的情况下,我们可以看到问题出在哪里,但无法找出原因。
2020-07-16 12:07:46.179 DEBUG --- [io-8443-exec-21] o.s.security.web.FilterChainProxy : / at position 9 of 11 in additional filter chain; firing Filter: 'GrailsRememberMeAuthenticationFilter'
2020-07-16 12:07:46.179 DEBUG --- [io-8443-exec-21] w.f.GrailsRememberMeAuthenticationFilter : SecurityContextHolder not populated with remember-me token, as it already contained: 'grails.plugin.springsecurity.authentication.GrailsAnonymousAuthenticationToken@dc4d198: Principal: org.springframework.security.core.userdetails.User@dc730200: Username: __grails.anonymous.user__; Password: [PROTECTED]; Enabled: false; AccountNonExpired: false; credentialsNonExpired: false; AccountNonLocked: false; Granted Authorities: ROLE_ANONYMOUS; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@7798: RemoteIpAddress: XXX.XXX.XX.XXX; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'
当它仅在内部服务器上在我们的应用程序实例上运行时,我们的自定义userDetailsService将用作主体,而不是 grails.anonymous.user 。
2020-07-16 12:07:46.947 DEBUG --- [nio-8443-exec-6] o.s.security.web.FilterChainProxy : / at position 9 of 11 in additional filter chain; firing Filter: 'GrailsRememberMeAuthenticationFilter'
2020-07-16 12:07:46.947 DEBUG --- [nio-8443-exec-6] w.f.GrailsRememberMeAuthenticationFilter : SecurityContextHolder not populated with remember-me token, as it already contained: 'org.springframework.security.cas.authentication.CasAuthenticationToken@a53948f3: Principal: edu.utica.grails.security.UticaUserDetails@6e9a437b: Username: XXXXXX; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN,ROLE_FINAID,ROLE_STUDENT,ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffff4c9c: RemoteIpAddress: XXX.XX.XXXX.XX; SessionId: CFC5F608B6E1A847F43BD18FC91480F2; Granted Authorities: ROLE_ADMIN, ROLE_FINAID, ROLE_STUDENT, ROLE_USER Assertion: org.jasig.cas.client.validation.AssertionImpl@7c7827d0 Credentials (Service/Proxy Ticket): ST-eff75341bc2e4124b1563d16823ce021-XXX.XXXX.XXX'
谁能告诉我为什么在一个实例中SecurityContextHolder从我们的userDetailsService获取主体,而CAS正常工作,而在另一个实例中,负载均衡器背后的SecurityContextHolder却获得'grails.plugin.springsecurity.authentication.GrailsAnonymousAuthenticationToken@dc4d198:主体:org.springframework.security.core.userdetails.User@dc730200:用户名: grails.anonymous.user ;
谢谢, 迈克
答案 0 :(得分:0)
好吧,我确定可以通过Grails配置对此进行修复,但是我还没有弄清楚。
我们确实通过在此处进行一些设置来使应用程序通过负载均衡器工作,现在,该应用程序允许CAS单一登录可用于grails应用程序。我不是通过进行更改来完成这项工作的人,因此,我将尽力尽力解释所做的事情。
我们要运行内部服务器上的这些应用程序,因此我们试图设置第7层https负载平衡器,以便所有来自不同服务器的应用程序都具有一个面向公众的URL。首次设置时,使用了“即时SSL”服务类型。据说这是设置为具有自动HTTP重定向,但不适用于我的grails应用。一旦将第7层负载平衡器更改为仅具有纯HTTPS服务且没有自动重定向的服务,它就可以正常工作。
我们不确定为什么会有所作为,因为我们一直都在使用https://。