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