Pergunta

Preciso ter uma autenticação personalizada na primavera, deve ser uma classe simples que pega o nome de usuário e a senha fornecidos por um usuário e a compara com alguns valores e com base nisso deve se autenticar.

Estamos usando um sistema fabricado no GWT, nosso formulário de login, no sucesso, abre outra página em uma nova janela.

É isso que tentei até agora: Arquivo: Application-Context Security:

...
<http auto-config="true">
           <intercept-url pattern='/*Login.html' access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern='/**/*MainScreen.html' access="ROLE_ADMIN"/>   
        <form-login login-page="/Login.html"/><!-- This is the default login page -->
    </http>
<authentication-provider>
        <user-service>
            <user name="test1" password="abc" authorities="ROLE_ADMIN" />
            <user name="test2" password="test" authorities="ROLE_ADMIN" />
        </user-service>
</authentication-provider>
...

Código de login personalizado (ao clicar no botão OK):

        RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST,"j_spring_security_check");
        requestBuilder.setHeader("Content-Type", "application/x-www-form-urlencoded");
        //-- sending the username and the password in designated fields.
        //Hard coding values for testing reasons:
        requestBuilder.setRequestData("j_username=test1" +
                        "&j_password=abc");

        requestBuilder.setCallback(new RequestCallback() {
            public void onError(Request request, Throwable exception)
            {
                Window.alert("ERROR !!!"+exception.getMessage());
            }
            public void onResponseReceived(Request request, Response response)
            {
                if (response.getStatusCode() != Response.SC_UNAUTHORIZED && response.getStatusCode() != Response.SC_OK)
                { 
                    onError(request, new RequestException(response.getStatusText() + ":\n" + response.getText())); 
                    return; 
                }

                if (response.getStatusCode() == Response.SC_UNAUTHORIZED)
                { 
                    //This code is never encountered !! :((
                    Window.alert("You have entered an incorrect username or password. Please try again."); 
                }
                else
                { 
                    String height = 800+"";
                    String width = 600+"";

                    Window.alert("Authorisation succeeded, you may enter....");
                    Window.open("MainScreen.html", "Main screen!!", "height=" + height + ",width=" + width
                                    + ",scrollbars=yes,resizable=yes,titlebar=no,toolbar=no,status=yes,close=no,left=0,top=0");
                } 

            }
        });
        requestBuilder.send();

Problemas:

  1. Login incorreto: mostra sucesso e abre pop -up contendo tela de login !! (Obviamente, o login não teve sucesso, mas a tela de login não conseguiu detectar isso)
  2. Não quero codificar os valores no provedor de autenticação, existe outra maneira de que eu forneço minha própria classe? Eu tentei vários tutoriais, mas em vão, todos eles parecem me apontar para que a Spring faça o trabalho de comparação por meio de um banco de dados ou algum outro tipo de arquivo, não posso fazer isso sozinho?
Foi útil?

Solução

Parece -me que você precisa escrever seu próprio UserDetailSService. Esta é a interface de segurança da primavera que preenche o SecurityContext.getPrincipal () com os userDetails. Se, no final da cadeia de filtros de segurança, esse objeto não tiver sido preenchido, a Spring lançará uma exceção de autorização que pode ser capturada e o usuário poderá ser re-dirigido para outra página/parte do aplicativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top