Irgendwie habe ich es im Stil für SIer geschrieben. Die Umgebung ist auch Java 1.7.
Die Methode der Standardauthentifizierung in Spring Boot wird anhand eines Beispielcodes erläutert. Unter der Annahme, dass die Verwendungsszene WebAPI ist, wird die Einstellung so eingestellt, dass sie die zustandslose Kommunikation unterstützt.
Version | |
---|---|
Java | 1.7 |
Spring Boot | 1.5.9.RELEASE |
Nehmen Sie die folgenden Einstellungen in JavaConfig vor. In den Kommentaren im Quellcode finden Sie spezifische Einstellungen.
MyConfigure.java
@Configuration
public class MyConfigure extends WebSecurityConfigurerAdapter {
// ----------------------------------------
//Spring Security-Einstellungen
// ----------------------------------------
// <<<* Beachten Sie, dass WebSecurityConfigurerAdapter über mehrere Konfigurationsüberladungsmethoden verfügt.>>>
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { super.configure(auth); }
@Override public void configure(WebSecurity web) throws Exception { super.configure(web); }
//---
@Override
protected void configure(HttpSecurity http) throws Exception {
//Grundlegende Authentifizierungseinstellungen
http.httpBasic().realmName("My sample realm");
//Festlegen von Anforderungen, die eine Authentifizierung erfordern
http.authorizeRequests().anyRequest().authenticated();
//Wenn CSRF-Maßnahmen aktiviert sind, führt POST ohne Token zu einem Fehler. Deaktivieren Sie ihn daher.
http.csrf().disable();
//Anmeldeinformationen werden immer aus dem Autorisierungsheader abgerufen, sodass Sitzungen nicht mithilfe von Cookies verwaltet werden müssen.
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
// ----------------------------------------
//Bohnendefinition
// ----------------------------------------
@Bean
public UserDetailsService userDetailsService() {
return new LoginPrincipal.LoginPrincipalService();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Anmeldeinformationen werden als eine Klasse definiert, die UserDetails
[^ fqdn-1]( LoginPrincipal
) implementiert.
Diese Klasse sollte unter Berücksichtigung der folgenden Punkte gestaltet werden.
UserDetails
Basierend auf dem oben Gesagten hat dieses Beispiel das folgende Design.
-Halten Sie die "Login ID" in * Benutzername *
Durch Definieren der Implementierungsklasse von "UserDetailsService" [^ fqdn-2] als Bean können Sie die Implementierung definieren, wenn Spring Security nach Anmeldeinformationen sucht ("LoginPrincipal.LoginPrincipalService"). Diese Klasse ist zur Vereinfachung des Codes als innere Klasse von "LoginPrincipal" definiert.
In der Klasse "LoginPrincipal.DB" wird die Dummy-Verarbeitung definiert, damit der Beispielcode alleine arbeiten kann.
LoginPrincipal.java
// ======================================================================
//* UserDetails-Implementierungsklasse
// ======================================================================
public class LoginPrincipal extends org.springframework.security.core.userdetails.User {
// ※loginId(Anmelde-ID)Ist super.In Benutzername behalten
private final String employeeNumber; //Mitarbeiternummer
public LoginPrincipal(String loginId, String employeeNumber, String encodedPassword, String[] roles) {
super(loginId, encodedPassword, true, true, true, true, AuthorityUtils.createAuthorityList(roles));
this.employeeNumber = employeeNumber;
}
public String getLoginId() {
return super.getUsername();
}
// <<< Getter >>>
public String getEmployeeNumber() { return this.employeeNumber; }
//---
// ======================================================================
//* Implementierungsklasse von UserDetailsService
// ======================================================================
public static class LoginPrincipalService implements org.springframework.security.core.userdetails.UserDetailsService {
/**
*Suchen Sie nach Anmeldeinformationen mit der angegebenen Anmelde-ID.
*Wenn keine Anmeldeinformationen gefunden werden, ist das Ergebnis{@code null}ist.
*/
public LoginPrincipal findByLoginId(String loginId) {
//* Tatsächlich erhalten Sie hier die Authentifizierungsinformationen aus der Datenbank
return DB.AUTH_TABLE.get(loginId);
}
/** {@inheritDoc} */
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//* Für den Benutzernamen wird der "Benutzername" für die Basisauthentifizierung durch die Authentifizierungsfunktion von Spring Security festgelegt.
//Delegieren Sie an findByLoginId
LoginPrincipal found = this.findByLoginId(username);
if (found == null) {
throw new UsernameNotFoundException("username not found: " + username);
}
return found;
}
}
// ======================================================================
// (Für Proben)Halten Sie Benutzerauthentifizierungsinformationen in Map als Alternative zum Benutzerauthentifizierungsmaster
// ======================================================================
private static class DB {
public static final Map<String, LoginPrincipal> AUTH_TABLE = new HashMap<>();
static {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
LoginPrincipal[] data = { //
new LoginPrincipal("U001", "S000001", passwordEncoder.encode("pass1"), new String[] { "USER" }), //
new LoginPrincipal("U002", "S000002", passwordEncoder.encode("pass2"), new String[] { "USER" }), //
};
for (LoginPrincipal d : data) {
AUTH_TABLE.put(d.getLoginId(), d);
}
}
}
}
Die Standardauthentifizierung ist jetzt aktiviert. Das folgende Beispiel bezieht sich auf die Authentifizierungsinformationen vom Controller.
MyController.java
@RestController
public class MyController {
@GetMapping
public String index() {
SecurityContext securityContext = SecurityContextHolder.getContext();
LoginPrincipal loginPrincipal = (LoginPrincipal) securityContext.getAuthentication().getPrincipal();
return "Hello " + loginPrincipal.getEmployeeNumber() + "!";
}
}
Dies ist mein erster Qiita-Beitrag. Ich hoffe ich kann weitermachen. Vielen Dank für Ihre Anleitung und Ermutigung.
Recommended Posts