Pregunta

Necesito tener una autenticación personalizada en Spring, debe ser una clase simple que tome el nombre de usuario y la contraseña provistos por un usuario y los compare con algunos valores, y en base a eso debería autenticarse.

Estamos utilizando un sistema hecho en GWT, nuestro formulario de inicio de sesión, en caso de éxito, abre otra página en una nueva ventana.

Esto es lo que he intentado hasta ahora: archivo: aplicación de contexto de seguridad:

...
<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 inicio de sesión personalizado (al hacer clic en el botón Aceptar):

        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. Inicio de sesión incorrecto: ¡muestra éxito y abre una ventana emergente que contiene la pantalla de inicio de sesión! (obviamente el inicio de sesión no tuvo éxito, pero la pantalla de inicio de sesión no pudo detectar eso)
  2. No quiero codificar los valores en el proveedor de autenticación, ¿hay alguna otra forma que proporcione mi propia clase? Probé varios tutoriales, pero en vano, todos parecen apuntarme a permitir que Spring haga el trabajo de comparación a través de una base de datos o algún otro tipo de archivo, ¿no puedo hacerlo yo mismo?
¿Fue útil?

Solución

Me parece que necesitas escribir tu propio UserDetailsService. Esta es la interfaz de seguridad de Spring que llena el SecurityContext.getPrincipal () con el UserDetails. Si, al final de la Cadena de filtros de seguridad, este objeto no se ha rellenado, Spring lanzará una excepción de autorización que puede ser detectada y el usuario puede ser redirigido a otra página / parte de la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top