Como corrigir o problema de ‘HTTP Status 400 - JBWEB000006: Invalid direct reference to form login page’.

Ao acessar a aplicação pela página de login diretamente, como ex http://localhost:8080/idp/j_security_check, surge o erro de Invalid direct reference to form login page após o login com sucesso. Ao acessar a aplicação normalmente, algo como http://localhost:8080/idp, tudo funciona bem.

Versões no ambiente

  • JBoss EAP 6.4.23

Motivo

Se você tentar acessar um recurso protegido, o JBoss vai redirecionar para a página de login, conforme configuração no web.xml. Uma vez autenticado, ele irá redirecionar para a página inicial solicitada. Se você acessar diretamente a página de login, como ex http://localhost:8080/idp/j_security_check, não há solicitação inicial (para onde o usuário desejaria ir), daí o erro: “HTTP Status 400 - JBWEB000006: Invalid direct reference to form login page”.

Log

Ativando os logs org.apache.catalina e org.jboss.security é possível ver a tentativa de redirect para null que faz surgir o problema. Observar no log abaixo a linha Redirecting to original ‘null’.

DEBUG [org.apache.catalina.authenticator] (http-0.0.0.0:8080-5) Security checking request POST /idp/j_security_check
DEBUG [org.apache.catalina.authenticator] (http-0.0.0.0:8080-5) Authenticating username '11111111111'
TRACE [org.jboss.security] (http-0.0.0.0:8080-5) PBOX000200: Begin isValid, principal: 11111111111, cache entry: org.jboss.security.authentication.JBossCachedAuthenticationManager$DomainInfo@633c863
TRACE [org.jboss.security] (http-0.0.0.0:8080-5) PBOX000204: Begin validateCache, domainInfo: org.jboss.security.authentication.JBossCachedAuthenticationManager$DomainInfo@633c863, credential class: class java.lang.String
TRACE [org.jboss.security] (http-0.0.0.0:8080-5) PBOX000205: End validateCache, result = true
TRACE [org.jboss.security] (http-0.0.0.0:8080-5) PBOX000201: End isValid, result = true
DEBUG [org.apache.catalina.authenticator] (http-0.0.0.0:8080-5) Authentication of '11111111111' was successful
DEBUG [org.apache.catalina.authenticator] (http-0.0.0.0:8080-5) Redirecting to original 'null'
DEBUG [org.apache.catalina.authenticator] (http-0.0.0.0:8080-5)  Failed authenticate() test ??/idp/j_security_check
TRACE [org.jboss.security] (http-0.0.0.0:8080-5) PBOX000354: Setting security roles ThreadLocal: null

Solução

Configurar a página de landing, que será utilizada para redirecionar o usuário após o login quando não houver uma requisição inicial para outro recurso.

No jboss-web.xml adicionar:

<valve>
    <class-name>org.apache.catalina.authenticator.FormAuthenticator
    </class-name>
    <param>
        <param-name>landingPage</param-name>
        <param-value>/</param-value>
    </param>
</valve>

O param-value deve ser ajustado conforme a aplicação. Observar também que no exemplo acima a autenticação é do tipo form.

Referências