Eu tenho lutado com esse mesmo problema por alguns dias e eu poderia ter quebrado isso. Eu sou novo no Spring Security, então não tome isso como um evangelho! Outros podem objetar ... Estou usando o Apache 2.4 (no OS X) e o Spring Security 4.1.1.
Tudo correu perfeitamente bem a correr localmente, mas sempre que foi implementado para correr atrás de um proxy reverso, recebi erros 404 sempre que iniciei sessão. Depois de muito arranhão e pesquisando no Google, aqui está o que encontrei:
(Como não tenho pontos de reputação suficientes para postar mais do que 2 links, tive que usar um espaço depois de 'http: //' para as URLs!)
Suponha que o Apache e o Tomcat estejam sendo executados no mesmo host (localhost) com o Apache configurado para solicitações de proxy de www.example.com em nosso aplicativo da web implantado no caminho de contexto '/ webapp'
ProxyPass / http://localhost:8080/webapp/
ProxyPassReverse / http://localhost:8080/webapp/
-
Cliente externo solicita URL protegida: http: // www.example.com/secret
GET /secret HTTP/1.1
-
O Apache faz proxy para http: // localhost: 8080 / webapp / secret
-
Um dos filtros de segurança do Spring intervém e responde com um redirecionamento para / login
HTTP/1.1 302 Found Location: http://www.example.com/login
-
O navegador busca URL
GET /login HTTP/1.1
-
O Apache faz proxy para http: // localhost: 8080 / webapp / login
-
O Spring responde com sua página de login padrão
HTTP/1.1 200 OK
-
O interessante a ser observado neste momento é que o formulário de login gerado pelo Spring prefixa o elemento de ação forms com o caminho do contexto (por exemplo, action="/ webapp / login"). Quando você clica no botão enviar, um POST é executado para o URL / webapp / login
POST /webapp/login HTTP/1.1
Agora temos um problema. Quando o Apache faz proxy para o servidor backend, a URL resultante será http: // localhost / webapp / webapp / login. Você pode ver isso no log catalina.out mostrando que não existe um manipulador que possa manipular a solicitação, pois o caminho do contexto agora está aparecendo duas vezes na URL.
O problema aqui é que as diretivas ProxyPass e ProxyReversePass (módulo mod_proxy) apenas modificam o cabeçalho HTTP Location, a URL é deixada intacta. O que é necessário é retirar o caminho do contexto do URL antes que ele atinja o proxy que o adicionará novamente. O RewriteRule do Apache parece funcionar:
RewriteRule /webapp/(.*)$ http://localhost:8080/webapp/$1 [P]
Embora isso resolvesse os erros 404 e eu pudesse ver que o Apache estava agora fazendo proxy para a URL correta, eu estava constantemente recebendo a página de login novamente toda vez que eu logado. Esse próximo bit de configuração parece resolver isso:
ProxyPassReverseCookieDomain localhost www.example.com
ProxyPassReverseCookiePath /webapp/ /
Eu acredito que isso pode ser porque o proxy estava causando o domínio e caminho no cookie para ser definido incorretamente, mas eu tenho que ler mais sobre isso!
Espero que isso ajude alguém mais por aí, e pessoas com mais experiência do que eu nesta área podem comentar se esta é uma solução justa ...