Das Implementieren einer Authentifizierungsfunktion mit Spring Boot ist eine tägliche Routine. Trotz der Standardauthentifizierung kann jedoch eine Verarbeitung nach erfolgreicher Authentifizierung, eine Sperrverarbeitung nach einem Authentifizierungsfehler, ein Zurücksetzen der Anzahl von Fehlern oder eine Protokollausgabe durchgeführt werden.
Wenn es sich um ein allgemeines formLogin oder oauth2Login handelt, Die Lösung besteht darin, es in successHandler oder failHandler zu implementieren. .. ..
Ich werde es posten, weil es nicht viele Informationen auf Japanisch gab.
dependency spring boot 2.0.4.RELEASE lombok mit.
Implementieren Sie die Standardauthentifizierung in den Sicherheitseinstellungen. Registrieren Sie außerdem eine Klasse, die die RememberMeServices-Schnittstelle in SharedObject implementiert.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
MyRememberMeServices myRememberMeServices;
@Override
protected void configure(HttpSecurity http) throws Exception {
//Durch Ersetzen von RemembeMeServise kann die Verarbeitung vor und nach der Standardauthentifizierung ausgeführt werden.
http.setSharedObject(RememberMeServices.class,myRememberMeServices);
http.httpBasic()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); //Sitzungen mit Cookies müssen nicht verwaltet werden;
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(NoOpPasswordEncoder.getInstance()) //Erforderlich ab spring5?
.withUser("LLENN")
.password("p-chan")
.roles("GGO_USER");
}
}
Sie können die Erfolgs- oder Fehlerverarbeitung in der RememberMeServices-Oberfläche implementieren.
@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) {
//Lassen Sie den Benutzer für die Authentifizierung verwenden.
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);
}
}
Die obige Implementierung gibt nur ein Protokoll aus. Da die Klasse jedoch "@ Service" ist, können Sie Ihre Lieblingskomponente DI.
Beachten Sie jedoch, dass ** loginSuccess und loginFail nach dem Standardauthentifizierungsprozess ** aufgerufen werden.
Wenn Sie sich nicht anmelden, verfügen Sie nicht über Ihre Anmeldeinformationen. Zum Zeitpunkt von loginFial kann der für die Authentifizierung verwendete Benutzername daher nicht aus "Authentication :: getName" abgerufen werden, sondern muss aus den Header-Informationen von HttpServletRequest abgerufen werden.
das ist alles.
Die Quelle wurde auf github hochgeladen. Ich würde es begrüßen, wenn Sie sich darauf beziehen könnten. https://github.com/amanoese/spring-basic-auth-example
Es ist gut, den Prozess der RememberMe Services for Basic-Authentifizierung zu ersetzen, aber was ist, wenn die ursprüngliche Implementierung hervorragende Arbeit leistet? .. Als ich mir die Quelle ansah, fand ich den folgenden Code.
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) {
}
}
Es sieht aus wie eine Klasse, die zum Umschreiben vorbereitet ist. Was die Implementierung angeht, war ich verwirrt, weil ich den Ort, an dem autoLogin aufgerufen wurde, nicht finden konnte. .. ..
Frühling ist schwierig.
Recommended Posts