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

 张琇萍家云 发布于 2023-02-10 15:45

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

负载均衡器解密ssl连接并转发到我们实例的端口8080,添加适当的X-Forwarded-Proto报头.

我想任何直接访问安全页面使用https重定向到登录页面.

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

我把它放在我的config.groovy中:

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

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

然后我尝试了:

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

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

    问题只是生产设置(战争部署在负载均衡器后面的Tomcat).

    如果我在我的loacal开发机器上测试相同的config.groovy,重定向到https://myapp.com/login/auth就好了.

    我试图为spring安全性指定一个不同的httpsPort,它又适用于我的本地开发机器,但在部署的应用程序中完全被忽略,它会一直重定向到http

没有运气潜伏在类似的帖子,任何想法?

1 个回答
  • 我还使用https和负载均衡器在AWS上使用Spring Security Core 2.0-RC4托管我的Grails应用程序,感谢spock99(上图)和AWS的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 Security Core 2.0-RC4中不需要以下内容 - 它们已经在DefaultSecurityConfig.groovy中

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

    我得到了错误的'不健康'读数,因为点击'/'会返回302重定向到/ login/auth,所以我将一个health()方法添加到HomeController(我映射到'/ health')以供AWS点击:

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

    关键是我在Load Balancer上运行多个实例时没有正确处理会话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
    

    2023-02-10 15:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有