2013-12-13 126 views
8

重定向到登錄頁面我有一個Grails應用程序,使用運行在負載均衡器後面的AWS機器上的Spring Security Core。Grails Spring Security使用https

負載均衡器解密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

  1. 的問題只是生產設置(戰爭部署到Tomcat負載平衡器後面)presentig。
  2. 如果我在我的loacal開發機器上測試相同的config.groovy,重定向到https://myapp.com/login/auth發生得很好。
  3. 我試圖指定春季安全不同httpsPort,再次它的工作我的本地開發計算機上,但它是在部署應用程序,不斷重定向完全忽略到http

沒有運氣潛伏在類似的帖子,任何理念?

回答

4

我剛剛經歷了同樣的情況。卡在https上,然後重定向,現在一切正常。使用這些Config.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」。

我的魔豆負載均衡器的設置是這樣的(我已經安裝了一個SSL證書,我沒有表現出來):

enter image description here

在EC2負載均衡器設置,確保你的聽衆是正確的設置:

enter image description here

終於在EC2安全組確保EB接受從ELB端口80和443請求:

無處在我的任何設置就我所引用的端口8080或8443,儘管這是我在我的本地測試使用

enter image description here

注意。有人閱讀此文可能會考慮嘗試使用這些端口來解決問題。我的設置不需要。

+0

非常感謝您的幫助,但沒有運氣!我再現了相同的設置,也將內部端口移動到80,但它總是重定向到http ...你有什麼在grails.plugin.springsecurity.secureChannel.definition?任何想法,我怎麼能至少調試它? – Paull

+1

我沒有爲secureChannel.definition設置值。您是否爲您的生產環境設置了grails.serverURL?那是破壞我的應用程序的其他內容,但我認爲這與設置雲端有關。我沒有用日誌進行調試。我會在配置文件中進行更改並上傳新的戰爭,然後使用瀏覽器瀏覽每個場景以查看破壞情況。然後,我會做出改變,然後再試一次。 – spock99

+0

您使用的是什麼版本的spring security? – spock99

4

我也在AWS上使用https和負載平衡器來託管我的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的核2.0-RC4 - 它們已經在DefaultSecurityConfig.groovy

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

我因爲點擊'/'返回302重定向到/ login/auth,所以我向HomeController(我將其映射到'/ 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 
1

我遇到類似的問題,在類似的環境中,前端是在HTTPS和防火牆後面的Grails的服務器是在HTTP。 當會話超時時,ajax和角度$ http用於獲取重定向消息到http://myclient.com/myWar/login/auth。此重定向請求用於導致瀏覽器拒絕訪問,因爲原始網址是https,混合內容已禁用。 我曾經得到SCRIPT7002:XMLHttpRequest:網絡錯誤0x80700013,由於錯誤80700013而無法完成操作。「 此錯誤僅在生產中發生,而不是在測試環境中發生。

修復很簡單,只需將以下內容添加到配置文件中。 grails.serverURL =「https://mywebsitespublicaddress.com/myWar