D'une manière ou d'une autre, je l'ai écrit dans un style pour SIer. L'environnement est également Java 1.7.
La méthode d'authentification de base dans Spring Boot est expliquée à l'aide d'un exemple de code. En supposant que la scène d'utilisation soit WebAPI, le paramètre est défini pour prendre en charge la communication sans état.
Version | |
---|---|
Java | 1.7 |
Spring Boot | 1.5.9.RELEASE |
Définissez les paramètres suivants dans JavaConfig. Voir les commentaires dans le code source pour les paramètres spécifiques.
MyConfigure.java
@Configuration
public class MyConfigure extends WebSecurityConfigurerAdapter {
// ----------------------------------------
//Paramètres de sécurité Spring
// ----------------------------------------
// <<<* Veuillez noter que WebSecurityConfigurerAdapter a plusieurs méthodes de configuration de surcharge.>>>
@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 {
//Paramètres d'authentification de base
http.httpBasic().realmName("My sample realm");
//Définition des demandes nécessitant une authentification
http.authorizeRequests().anyRequest().authenticated();
//Si les mesures CSRF sont activées, POST sans jeton entraînera une erreur, alors désactivez-le.
http.csrf().disable();
//Les informations d'identification sont toujours récupérées à partir de l'en-tête d'autorisation, éliminant ainsi le besoin de gestion de session de cookie
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
// ----------------------------------------
//Définition du haricot
// ----------------------------------------
@Bean
public UserDetailsService userDetailsService() {
return new LoginPrincipal.LoginPrincipalService();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Les informations d'identification sont définies comme une classe qui implémente ʻUserDetails [^ fqdn-1](
LoginPrincipal`).
Cette classe doit être conçue en gardant à l'esprit les points suivants.
Basé sur ce qui précède, cet exemple a la conception suivante.
-Maintenez le "login ID" dans * nom d'utilisateur *
ʻEn définissant la classe d'implémentation de UserDetailsService [^ fqdn-2] comme bean, vous pouvez définir l'implémentation lorsque Spring Security recherche des informations d'identification (
LoginPrincipal.LoginPrincipalService). Cette classe est définie comme une classe interne de
LoginPrincipal` pour la simplification du code.
Dans la classe LoginPrincipal.DB
, le traitement factice est défini pour permettre à l'exemple de code de fonctionner seul.
LoginPrincipal.java
// ======================================================================
//* Classe d'implémentation UserDetails
// ======================================================================
public class LoginPrincipal extends org.springframework.security.core.userdetails.User {
// ※loginId(Identifiant de connexion)Est super.Conserver le nom d'utilisateur
private final String employeeNumber; //numéro d'employé
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; }
//---
// ======================================================================
//* Classe d'implémentation de UserDetailsService
// ======================================================================
public static class LoginPrincipalService implements org.springframework.security.core.userdetails.UserDetailsService {
/**
*Recherchez les informations d'identification avec l'ID de connexion spécifié.
*Si aucune information d'identification n'est trouvée, le résultat est{@code null}est.
*/
public LoginPrincipal findByLoginId(String loginId) {
//* En fait, obtenez les informations d'authentification de la base de données ici
return DB.AUTH_TABLE.get(loginId);
}
/** {@inheritDoc} */
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//* Pour le nom d'utilisateur, le "nom d'utilisateur" pour l'authentification de base est défini par la fonction d'authentification de Spring Security.
//Délégué à findByLoginId
LoginPrincipal found = this.findByLoginId(username);
if (found == null) {
throw new UsernameNotFoundException("username not found: " + username);
}
return found;
}
}
// ======================================================================
// (Pour les échantillons)Conserver les informations d'authentification utilisateur dans Map comme alternative au maître d'authentification utilisateur
// ======================================================================
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);
}
}
}
}
L'authentification de base est maintenant activée. Voici un exemple qui fait référence aux informations d'authentification du contrôleur.
MyController.java
@RestController
public class MyController {
@GetMapping
public String index() {
SecurityContext securityContext = SecurityContextHolder.getContext();
LoginPrincipal loginPrincipal = (LoginPrincipal) securityContext.getAuthentication().getPrincipal();
return "Hello " + loginPrincipal.getEmployeeNumber() + "!";
}
}
Ceci est mon premier article sur Qiita. J'espère pouvoir continuer. Merci pour vos conseils et vos encouragements.
Recommended Posts