2013-12-13 21 views
8

Tôi có một ứng dụng Grails sử dụng Spring Security Core chạy trên một máy AWS phía sau bộ cân bằng tải.Grails Spring Security chuyển hướng đến trang đăng nhập bằng cách sử dụng https

Bộ cân bằng tải giải mã các kết nối ssl và chuyển tiếp đến cổng 8080 của cá thể của chúng tôi, thêm các tiêu đề X-Forwarded-Proto thích hợp.

Tôi muốn có quyền truy cập trực tiếp vào trang được bảo mật để chuyển hướng đến trang đăng nhập bằng https.

Ví dụ một yêu cầu https://myapp.com/private/page nên chuyển hướng đến https://myapp.com/login/auth

tôi đặt này trong config.groovy tôi:

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

nhưng điều này gây ra một vòng lặp chuyển hướng (mã HTTP 302) vào trang http đăng nhập (http://myapp.com/login/auth)

Sau đó, tôi cố gắng chỉ với:

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

nhưng điều này gây ra một chuyển hướng (HTTP mã 302) vào trang http đăng nhập (http://myapp.com/login/auth)

  1. Vấn đề này được presentig chỉ với các thiết lập sản xuất (chiến tranh được triển khai để Tomcat đằng sau những cân bằng tải).
  2. Nếu tôi kiểm tra cùng một config.groovy trên máy dev loacal của tôi, chuyển hướng đến https://myapp.com/login/auth xảy ra tốt.
  3. tôi đã cố gắng để xác định một httpsPort khác nhau cho an ninh mùa xuân, một lần nữa nó hoạt động trên máy dev địa phương của tôi, nhưng nó hoàn toàn bị bỏ qua trong ứng dụng được triển khai mà giữ chuyển hướng đến http

Không may mắn rình rập ở bài viết tương tự, bất kỳ ý kiến?

Trả lời

4

Tôi vừa trải qua cùng một tình huống. Đã bị mắc kẹt trên https, sau đó chuyển hướng, và bây giờ tất cả là tốt. Sử dụng các cài đặt Config.groovy này:

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' 

Lưu ý cho những người không sử dụng springecurity 2.0, đó là 'plugin' chứ không phải 'plugin' mà không có 's'.

thiết lập cân bằng tải cây đậu của tôi trông như thế này (tôi đã cài đặt một cert SSL, tôi không thấy nó):

enter image description here

Trong cài đặt cân bằng tải EC2 chắc chắn người nghe của bạn được thiết ngay :

enter image description here

và cuối cùng trong nhóm bảo mật EC2 đảm bảo EB chấp nhận yêu cầu trên cổng 80 và 443 từ ELB:

enter image description here

Lưu ý rằng không có nơi nào trong thiết lập bất kỳ thứ gì tôi tham chiếu cổng 8080 hoặc 8443, mặc dù đó là những gì tôi sử dụng trên máy chủ cục bộ để thử nghiệm. Ai đó đọc sách này có thể nghĩ đến việc cố gắng sử dụng các cổng đó để khắc phục sự cố. Thiết lập của tôi không yêu cầu điều đó.

+0

Cảm ơn rất nhiều sự giúp đỡ của bạn nhưng không may mắn! Tôi sao chép các thiết lập tương tự, cũng di chuyển cổng nội bộ đến 80 nhưng nó luôn luôn chuyển hướng đến http ... Bạn có bất cứ điều gì trong grails.plugin.springsecurity.secureChannel.definition? Bất kỳ ý tưởng về làm thế nào tôi có thể ít nhất là gỡ lỗi nó? – Paull

+1

Tôi không có giá trị được đặt cho secureChannel.definition. Bạn có tập hợp grails.serverURL cho môi trường sản xuất của mình không? Đó là cái gì đó khác đã phá vỡ ứng dụng của tôi, nhưng tôi nghĩ rằng đó là liên quan đến việc thiết lập cloudfront. Tôi đã không gỡ lỗi nó bằng nhật ký. Tôi sẽ thực hiện một thay đổi trong tập tin cấu hình và tải lên một cuộc chiến tranh mới, sau đó bước qua từng kịch bản bằng cách sử dụng một trình duyệt để xem những gì đã phá vỡ. Sau đó, tôi sẽ thực hiện một thay đổi và thử lại. – spock99

+0

Bạn đang sử dụng phiên bản bảo mật mùa xuân nào? – spock99

4

Tôi cũng đang lưu trữ ứng dụng Grails của mình với Spring Security Core 2.0-RC4 trên AWS với https và bộ cân bằng tải và nhờ vào số spock99 (ở trên) và Ravi L của AWS.

tôi đã làm như sau trong 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 

LƯU Ý: Sau đây là không cần thiết trong mùa xuân an Lõi 2.0 RC4 - họ đã có trong DefaultSecurityConfig.groovy

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

tôi đã nhận được thông báo sai 'không lành mạnh' vì nhấn '/' trả về chuyển hướng 302 thành/login/auth, vì vậy tôi đã thêm phương thức health() vào HomeController (mà tôi ánh xạ tới '/ health') để AWS truy cập:

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

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

Chìa khóa cho tôi là cookie phiên không được xử lý đúng cách với nhiều phiên bản chạy trên Trình cân bằng tải (Tôi không phát hiện ra điều này cho đến khi đặt trường hợp tối thiểu là 2), để người dùng có thể đăng nhập trong và gian tự động thoát, tôi đã làm như sau trên 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

tôi phải đối mặt với vấn đề tương tự trong môi trường tương tự như nơi cuối phía trước là trên https và phía sau máy chủ grails tường lửa là vào http. Khi phiên hết hạn, ajax và góc $ http được sử dụng để nhận thông báo chuyển hướng đến http://myclient.com/myWar/login/auth. Yêu cầu chuyển hướng này được sử dụng để khiến quyền truy cập bị từ chối trong trình duyệt vì url gốc là https và nội dung hỗn hợp đã bị tắt. Tôi đã từng sử dụng SCRIPT7002: XMLHttpRequest: Lỗi mạng 0x80700013, Không thể hoàn thành thao tác do lỗi 80700013. ” Lỗi này chỉ xảy ra trong quá trình sản xuất chứ không phải trong môi trường thử nghiệm.

Khắc phục đơn giản, chỉ cần thêm phần sau vào tệp cấu hình. grails.serverURL = "https://mywebsitespublicaddress.com/myWar"

Các vấn đề liên quan