[JAVA] Exécutez un traitement arbitraire après l'authentification de base avec Spring Boot.

La mise en œuvre d'une fonction d'authentification avec Spring Boot est une routine quotidienne. Cependant, malgré l'authentification de base, le traitement après une authentification réussie, le traitement de verrouillage après l'échec de l'authentification, la réinitialisation du nombre d'échecs ou la sortie du journal peuvent être effectués.

S'il s'agit d'un formulaire généralLogin ou oauth2Login, La solution consiste à l'implémenter dans successHandler ou failureHandler. .. ..

Je le posterai car il n'y avait pas beaucoup d'informations en japonais.

dependency spring boot 2.0.4.RELEASE lombok en utilisant.

la mise en oeuvre

Implémentez l'authentification de base dans les paramètres de sécurité. Enregistrez également une classe qui implémente l'interface RememberMeServices dans SharedObject.

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    MyRememberMeServices myRememberMeServices;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //En remplaçant ici RemembeMeServise, le traitement peut être exécuté avant et après l'authentification de base.
        http.setSharedObject(RememberMeServices.class,myRememberMeServices);
        http.httpBasic()
                .and()
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated()
                .and()
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); //Pas besoin de gérer les sessions avec les cookies;
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .passwordEncoder(NoOpPasswordEncoder.getInstance()) //Requis à partir du printemps5?
                .withUser("LLENN")
                .password("p-chan")
                .roles("GGO_USER");
    }

}

Vous pouvez implémenter le traitement Success ou Fail dans l'interface RememberMeServices.

@Slf4j
@Service
public class MyRememberMeServices implements RememberMeServices {

	@Override
	public Authentication autoLogin(HttpServletRequest request, HttpServletResponse response) {
		return null;
	}
	@Override
	public void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) {
		log.info("login:{}",successfulAuthentication.getName());
	}

	@Override
	public void loginFail(HttpServletRequest request, HttpServletResponse response) {
		//Obtenez l'utilisateur utilisé pour l'authentification.
		String base64Credentials = request.getHeader("authorization").substring("Basic".length()).trim();
		String credentialSting = new String(Base64.getDecoder().decode(base64Credentials), Charset.forName("UTF-8"));
		String username = credentialSting.split(":")[0];

		log.error("login fail:{}",username);
	}
}

L'implémentation ci-dessus ne produit que le journal, mais comme la classe est `` @ Service '', vous pouvez DI votre composant préféré.

Cependant, sachez que ** loginSuccess et loginFail sont appelés après le processus d'authentification de base **.

Si vous ne parvenez pas à vous connecter, vous n'aurez pas vos informations d'identification. Par conséquent, au moment de loginFial, le nom d'utilisateur utilisé pour l'authentification ne peut pas être obtenu depuis Authentication :: getName, mais doit être obtenu à partir des informations d'en-tête de HttpServletRequest.

c'est tout.

La source a été téléchargée sur github. J'apprécierais que vous y fassiez référence. https://github.com/amanoese/spring-basic-auth-example

De côté

Il est bon de remplacer le processus des services RememberMe pour l'authentification de base, mais que se passe-t-il si l'implémentation d'origine fait un excellent travail? .. Quand j'ai regardé la source, j'ai trouvé le code suivant.

NullRememberMeServices


package org.springframework.security.web.authentication;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;

public class NullRememberMeServices implements RememberMeServices {
    public NullRememberMeServices() {
    }

    public Authentication autoLogin(HttpServletRequest request, HttpServletResponse response) {
        return null;
    }

    public void loginFail(HttpServletRequest request, HttpServletResponse response) {
    }

    public void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) {
    }
}

Cela ressemble à une classe préparée pour la réécriture. Dans la mesure où j'ai suivi la mise en œuvre, j'étais confus car je ne pouvais pas trouver l'endroit où autoLogin était appelé. .. ..

le printemps est difficile.

Recommended Posts

Exécutez un traitement arbitraire après l'authentification de base avec Spring Boot.
Utiliser l'authentification de base avec Spring Boot
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Traitement lors du démarrage d'une application avec Spring Boot
Traitement asynchrone avec Spring Boot en utilisant @Async
Traitement asynchrone avec exécution régulière dans Spring Boot
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Télécharger avec Spring Boot
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Authentification de base avec Java 11 HttpClient
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Spring avec Kotorin --6 Traitement asynchrone
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
[Java] Thymeleaf Basic (Spring Boot)
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Mise en œuvre de la fonction d'authentification avec Spring Security ②
gRPC sur Spring Boot avec grpc-spring-boot-starter
Implémentez la fonction d'authentification avec Spring Security ③
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Obtenez des résultats de validation avec Spring Boot
Découvrez l'architecture de traitement de l'authentification Spring Security
Authentification Oauth2 avec Spring Cloud Gateway
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot
À partir de Spring Boot 0. Utilisez Spring CLI
J'ai essayé Flyway avec Spring Boot
Certification / autorisation avec Spring Security & Thymeleaf
La coopération des messages a commencé avec Spring Boot
Introduction de l'authentification de base à Heroku [Spring Framework]
Hello World avec Eclipse + Spring Boot + Maven
Envoyez des notifications régulières avec LineNotify + Spring Boot
Effectuer un test de confirmation de transaction avec Spring Boot
Authentification DB avec Spring Security et hachage avec BCrypt
HTTPS avec Spring Boot et Let's Encrypt
Essayez d'utiliser Spring Boot avec VS Code