Grails - безопасный канал ядра безопасности, вызывающий петлю перенаправления (на Heroku)

Я использую Spring-security-core и настроил возможности безопасного канала, которые отлично работают на моей машине для разработки. У меня есть следующее в Config.groovy

grails.plugins.springsecurity.secureChannel.definition = [
   '/order/checkout': 'REQUIRES_SECURE_CHANNEL',
   '/order/paymentComplete': 'REQUIRES_INSECURE_CHANNEL'
]

Кроме того, при развертывании в Heroku соответствующая обработка заказов работает нормально,как долго как я закомментирую вышеупомянутые строки. Как только я возвращаю их обратно, я получаю:

Я вижу, что на сервер поступает много запросов, и сетевое представление Firebug показывает:

Я добавил PiggyBack SSL в Heroku, и я могу указать адрес https: // ... для перехода к другим частям сайта, и в этом случае браузер остается в режиме SSL. Но если я получу доступ к

https:/www.momentumnow.co/order/checkout 

адрес, я получаю ту же проблему петли перенаправления. Знаете ли вы, в чем проблема или как я могу отладить это дальше. Если последнее, не могли бы вы обновить область комментариев, и я отвечу с обновлениями проблемной области. Спасибо

PiggyBack SSLдокументация указывает:

«Piggyback SSL позволит вам использоватьhttps://yourapp.heroku.com, поскольку он использует сертификацию * .heroku.com. Вам не нужно покупать или настраивать сертификат, он просто работает.https://yourcustomdomain.com будет работать, но он выдаст предупреждение в браузере. "

Я, вероятно, переключусь на другой режим при добавлении сертификата, однако это не является проблемой, основываясь на предыдущем утверждении.

На сервере я получаю:

 user164654504 сент. 2012 г., 16:47
Я нашел решение в этой теме:stackoverflow.com/questions/10137761/...
 Dale14 мар. 2012 г., 20:43
Привет Рэй, ты когда-нибудь получал ответ на это? У меня похожая проблема в Clojure на Heroku.

Ответы на вопрос(2)

так как они по умолчанию равны 8080 и 8443. См. Раздел «Безопасность канала» в документации -http://grails-plugins.github.com/grails-spring-security-core/docs/manual/ - оgrails.plugins.springsecurity.portMapper.httpPort а такжеgrails.plugins.springsecurity.portMapper.httpsPort атрибуты конфигурации.

 Ray01 февр. 2012 г., 07:37
Хм. Поиск Heroku для информации о порте SSL, не нашел, и поэтому я использовал 80 для httpPort и 443 для httpsPort. По-прежнему получаю ту же ошибку (за исключением того, что я вижу порт 443 в запросах). Кроме того, когда я просто делаюсайтЯ вижу, что удаленный порт равен 443 в пакетах, отправляемых туда и обратно, так что это, кажется, правильный порт.
 Ray01 февр. 2012 г., 06:59
Ах, замечательно. Спасибо за указание на общую проблему (а также за то, что показали мне, где найти ответ). Очень признателен. Отдельно, можете ли вы сказать мне, следует ли мне продолжать работу с Spring-security-UI (и добавить мой собственный регистрационный код) для работы на Heroku? (это проблема с плагинами, используемыми spring-security-ui, по-видимому, несовместимыми с плагином Heroku). Благодарю.

кто сталкивается с этой (как я) проблемой, является то, что ваше приложение на самом деле не получает запрос как HTTPS. Вместо этого Heroku заменяет HTTPS заголовком «X-Forwarded-Proto». HTTPS-перенаправление Spring-security в этом случае приводит вас в бесконечный цикл перенаправления, потому чтовсегда обнаруживает запрос как HTTP.

Вы можете написать свой собственныйSecureChannelProcessor иметь дело с этим:

public class HerokuSecureChannelProcessor extends SecureChannelProcessor {

    @Override
    public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config)
            throws IOException, ServletException {
        Assert.isTrue((invocation != null) && (config != null),
                "Nulls cannot be provided");

        for (ConfigAttribute attribute : config) {
            if (supports(attribute)) {
                String header = invocation.getHttpRequest().getHeader("X-Forwarded-Proto");
                if(header == null){
                    // proceed normally
                    if (!invocation.getHttpRequest().isSecure()) {
                        getEntryPoint().commence(invocation.getRequest(), invocation.getResponse());
                    }
                } else {
                    // use heroku header instead
                    if("http".equals(header)) {
                        getEntryPoint().commence(invocation.getRequest(), invocation.getResponse());
                    }
                }
            }
        }
    }
}

Ваш ответ на вопрос