Мне очень трудно понять, что происходит с приложением Grails 2.2.5, которое использует плагин Shiro (v.1.2.1). Это система, которая уже пару лет работает нормально. Он находится за удаленным прокси-сервером nginx, который до сих пор прослушивал порты 80/443. Мы только что переместили тестовую установку, и теперь у нее есть общий сервер с установкой Apache, которая имеет эти порты, поэтому у нас есть nginx, прослушивающий порты 8070 для http и 8443 для https. Это в основном работает, но есть некоторые озадачивающие проблемы с переадресацией, когда пользователь не аутентифицирован, и эти проблемы, похоже, исходят от Широ (хотя мне трудно быть уверенным).
По сути, происходит то, что когда неаутентифицированный пользователь переходит на «https://myapp.com:8443/admin/», приложение Grails выдает перенаправление, которое переводит его на «https://myapp.com:8443/auth/login?targetUri=%2F», т. Е. Контекст был удален. Он должен быть «https://myapp.com:8443/admin/auth/login?targetUri=%2F», и он есть на рабочем сервере, который использует стандартные порты (80/443). Фактически, когда я смотрю на заголовок Location в ответе, то на самом деле он отвечает «http://myapp.com:8070/auth/login?targetUri=%2F» (то есть с портом http, что не является проблемой, поскольку nginx обрабатывает SSL).
Поскольку мой код в AuthController.groovy фактически не задействован, пока не получит запрос / auth / login, эта проблема, похоже, не возникает из любого места в моем коде и должна исходить из плагина Shiro. Но почему нестандартный порт может вызывать эту проблему (удаление контекста)? И что еще более важно, что я могу сделать, чтобы решить эту проблему?
Я думаю, что, возможно, я ошибочно виню Широ или плагин Широ. Я решил проблему, которая, похоже, вызвана причудой самого Grails.
В версии 1 Grails нужно было правильно установить grails.serverURL в Config.groovy, чтобы перенаправления работали правильно, но с версией 2 это больше не было необходимо, и фактически это свойство было закомментировано во вновь созданном приложении.
Однако все, что было сделано, не очень хорошо работает с нестандартными портами. Если порт сервера - это что-то вроде 8070 или 8443, поскольку я использовал перенаправление, оно сформировано неправильно.
Я решил проблему, восстановив grails.serverURL и убедившись, что он правильно настроен. Теперь редиректы снова работают должным образом.