Question

Je dois avoir une authentification personnalisée au printemps, ce devrait être une classe simple qui prend le nom d'utilisateur et le mot de passe fournis par un utilisateur et les compare à certaines valeurs et sur la base desquelles il devrait s'authentifier.

Nous utilisons un système créé en GWT, notre formulaire de connexion, en cas de succès, ouvre une autre page dans une nouvelle fenêtre.

Voici ce que j'ai tenté jusqu'à présent: fichier: sécurité du contexte de l'application:

...
<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>
...

Code de connexion personnalisé (en cliquant sur le bouton 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();

Problèmes:

  1. Login incorrect: il montre le succès et ouvre une fenêtre contextuelle contenant l'écran de connexion !! (évidemment, la connexion n'a pas abouti, mais l'écran de connexion n'a pas pu le détecter)
  2. Je ne souhaite pas coder de manière stricte les valeurs dans le fournisseur d'authentification. Existe-t-il un autre moyen de fournir ma propre classe? J'ai essayé plusieurs tutoriels, mais en vain, ils semblent tous indiquer que je permets à spring de faire le travail de comparaison via une base de données ou un autre type de fichier, ne puis-je pas le faire moi-même?
Était-ce utile?

La solution

Il me semble que vous devez écrire votre propre UserDetailsService. Il s'agit de l'interface de sécurité Spring qui remplit SecurityContext.getPrincipal () avec UserDetails. Si, à la fin de la chaîne de filtres de sécurité, cet objet n'a pas été renseigné, Spring générera une exception d'autorisation qui peut être interceptée et l'utilisateur peut être redirigé vers une autre page / partie de l'application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top