当前位置: 首页 > 知识库问答 >
问题:

Grails Spring Security使用https重定向到登录页面

谭云瀚
2023-03-14

我有一个使用Spring Security Core的Grails应用程序,运行在负载平衡器后面的AWS机器上。

负载均衡器解密 ssl 连接并转发到实例的端口 8080,添加相应的 X 转发 Proto 标头。

我希望任何对安全页面的直接访问都使用https重定向到登录页面。

例如,请求 https://myapp.com/private/page 应重定向到 https://myapp.com/login/auth

我把它放在我的配置中:

grails.plugin.springsecurity.secureChannel.definition = [
    '/login/**':        'REQUIRES_SECURE_CHANNEL'
]

但这会导致HTTP登录页面的重定向循环(HTTP代码302)(http://myapp.com/login/auth)

然后我试着用:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.auth.forceHttps = true

但这会导致重定向(HTTP代码302)到超文本传输协议登录页面(http://myapp.com/login/auth)

  1. 问题只出现在生产设置中(war部署到负载均衡器后面的Tomcat)。
  2. 如果我在loacal开发机器上测试相同的config.groovy,重定向到https://myapp.com/login/auth就可以了。
  3. 我尝试为Spring Security指定一个不同的httpsPort,它同样适用于我的本地开发机器,但它在部署的应用程序中完全被忽略,该应用程序一直重定向到超文本传输协议

在类似的帖子里没有运气,知道吗?

共有3个答案

鲜于高明
2023-03-14

我在类似的环境中遇到过类似的问题,前端在https上,防火墙后面的grails服务器在http上。当会话超时时,ajax和angular $http用于将消息重定向到http://myclient.com/myWar/login/auth.。该重定向请求用于导致浏览器中的访问被拒绝,因为原始url是https并且混合内容被禁用。我曾经得到SCRIPT7002: XMLHttpRequest:网络错误0x80700013,由于错误80700013无法完成操作。“此错误只发生在生产环境中,而不是在测试环境中。

修复很简单,只需将以下内容添加到配置文件中即可。圣杯服务器URL =“https://mywebsitespublicaddress.com/myWar”

左丘阳晖
2023-03-14

我只是经历了同样的场景。卡在https上,然后是重定向,现在一切都很好。使用以下配置.groovy 设置:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.portMapper.httpPort = 80
grails.plugin.springsecurity.portMapper.httpsPort = 443
grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'

请注意,对于那些不使用springsecurity 2.0的用户,它是“插件”,而不是没有“s”的“插件”。

我的beanstalk负载平衡器设置看起来像这样(我安装了SSL证书,我没有显示它):

在EC2负载平衡器设置中,确保您的侦听器设置正确:

最后,在EC2安全组中,确保EB接受来自ELB的端口80和443上的请求:

请注意,在我的设置中,我从未引用过端口 8080 或 8443,即使这是我在本地主机上用于测试的内容。阅读本文的人可能会考虑尝试使用这些端口来解决问题。我的设置不需要这样做。

金子轩
2023-03-14

我还在AWS上使用https和负载均衡器托管我的带有Spring Security Core 2.0-RC4的Grails应用程序,并且感谢AWS的spock99(上图)和Ravi L,我让它正常工作。

我在config.groovy中执行了以下操作:

    // Required because user auth uses absolute redirects
    grails.serverURL = "http://example.com"

    grails.plugin.springsecurity.secureChannel.definition = [
        '/assets/**':     'ANY_CHANNEL',// make js, css, images available to logged out pages
        '/**':            'REQUIRES_SECURE_CHANNEL',
    ]

    // overriding values in DefaultSecurityConfig.groovy from the SpringSecurityCore 2.0-RC4 
    grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugin.springsecurity.portMapper.httpPort = 80
    grails.plugin.springsecurity.portMapper.httpsPort = 443

注意:Spring安全核心 2.0-RC4 中不需要以下内容 - 它们已在默认安全配置中

    secureHeaderName = 'X-Forwarded-Proto'
    secureHeaderValue = 'http'
    insecureHeaderName = 'X-Forwarded-Proto'
    insecureHeaderValue = 'https'

我得到了错误的“不正常”读数,因为点击“/”返回302重定向到/login/auth,所以我向主页控制器(我映射到“/health”)添加了一个health()方法,以便AWS点击:

    class HomeController {
        @Secured('IS_AUTHENTICATED_FULLY')
        def index() { }

        @Secured('permitAll')
        def health() { render '' }
    }

对我来说,关键是会话cookie在负载均衡器上运行多个实例时没有得到正确处理(直到将最小实例设置为2,我才发现这一点),因此为了让用户能够登录并保持登录状态,我在AWS上执行以下操作:

1.  At Services / Elastic Beanstalk / Configuration / Load Balancing 
    a. set Application health check URL: /health
    b. left Session Stickiness: unchecked
2. At Services / EC2 / Load Balancers / Description / Port Configuration:
    For both port 80 (HTTP)  and 443 (HTTPS)
        1. Edit and select 'Enable Application Generated Cookie Stickiness'
        2. Cookie Name: JSESSIONID
 类似资料:
  • 记录器文件中的日志- org.springframework.Security.Access.event.loggerlistener-安全授权失败,原因是:org.springframework.Security.Access.accessdeniedexception:访问被拒绝;通过身份验证的主体:org.springframework.security.authentication.ano

  • 我现在一直在努力使用我的登录页面来让组件呈现Loggedin组件。我的前端是Reactjs,后端是NodeJS。我对nodejs、expression和react都是新手。 在loginform组件上,我使用fetch进行了一次post,它将用户名和密码传递给后端的相应endpoint。没问题。在后端,它读取我存储用户(不使用任何数据库)的jsonfile来查找匹配项,如果用户名和密码都匹配,则它

  • 我在Laravel框架中的HomeController.php中有一段代码,但是我无法访问它重定向到登录页面的索引/主页。我犯了什么大错?

  • 这是views.py的内容: 在转到“/”时,我被重定向到“/accounts/login”,它将我带到登录页面。我输入用户名和密码后,在“验证”打印语句printd“登录”到终端。 到目前为止还不错。现在,我不再被重定向到“/”,而是再次被重定向到“/accounts/login”,并再次显示输入用户名和密码的页面。为什么?

  • 当(在Spring Security/MVC中)页面访问被拒绝时,由于用户没有足够的权限(尽管他已通过身份验证),我需要通过显示登录页面(而不是显示403拒绝访问页面的标准行为)提供作为另一个用户登录 我可以编写一个,重定向到登录页面。但是,当Spring Security发现有另一个用户登录时,它会做出怎样的反应?当新用户已成功通过身份验证时,我能否以某种方式注销旧用户?

  • 我使用的是Spring Security 4.1.1,但我遇到了一个问题:我试图访问URL,应用程序会重定向到登录页面。到现在为止,一直都还不错。 但是,成功登录后,应用程序会再次将我重定向到登录页面,并且不会创建任何会话,因此即使尝试直接访问URL(在URL栏中键入),应用程序也会重定向到登录页面。 有一些URL我必须要求登录才能访问它们。其他的,我可以访问无需身份验证。这些我不需要验证的URL