Ajoutez les deux
pom.xml
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
securityConfig.java
//importation omise
@Configuration //Classe de configuration
@EnableWebSecurity //Profitez des fonctionnalités Web de Spring Security
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService memberDetailsService;
/**
*En remplaçant cette méthode
*"Paramètres de sécurité" pour des demandes spécifiques
*Vous pouvez définir des paramètres liés à l'ensemble, tels que des paramètres à ignorer.
*Plus précisément, désactivez les paramètres de sécurité pour les ressources statiques.
*
* @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.WebSecurity)
*/
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers( "/css/**"
, "/img/**"
, "/js/**"
, "/fonts/**");
}
/**
*En remplaçant cette méthode, vous pouvez définir l'autorisation et vous connecter./Vous pouvez définir les paramètres liés à la déconnexion.
*
* @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() //Paramètres d'autorisation
.antMatchers("/","/login","/excuteLogin","/login/register").permitAll() //「/Autoriser tous les utilisateurs à passer comme
.antMatchers().hasRole("ADMIN") // /admin/Les chemins commençant par ne sont accessibles que si vous êtes connecté avec les privilèges ADMIN("ROLE" lors de la définition des autorisations_Spécifiez la chaîne de caractères à l'exclusion de "")
.antMatchers().hasRole("USER")
//.antMatchers("/admin/**").hasRole("ADMIN") // /admin/Les chemins commençant par ne sont accessibles que si vous êtes connecté avec les privilèges ADMIN("ROLE" lors de la définition des autorisations_Spécifiez la chaîne de caractères à l'exclusion de "")
//.antMatchers("/user/**").hasRole("USER") // /user/Les chemins commençant par ne sont accessibles que si vous êtes connecté avec les privilèges UTILISATEUR("ROLE" lors de la définition des autorisations_Spécifiez la chaîne de caractères à l'exclusion de "")
.anyRequest().authenticated(); //D'autres chemins nécessitent une authentification
http.formLogin() //Paramètres de connexion
.loginPage("/login") //Chemin de transition vers l'écran de connexion(Si vous spécifiez un chemin nécessitant une authentification de connexion et que vous n'êtes pas connecté, vous serez transféré vers ce chemin.)
.loginProcessingUrl("/excuteLogin") //Chemin vers la transition lorsque le bouton de connexion est enfoncé(Si vous passez à ici, vous serez automatiquement connecté.)
.failureUrl("/login?error=true") //Chemin de transition vers l'échec de connexion
.defaultSuccessUrl("/", true) //1er argument:Par défaut, le chemin vers la transition lorsque la connexion est réussie
//2ème argument: true :Passez toujours au chemin du premier argument après l'authentification
// false:Même si vous n'êtes pas authentifié et que vous êtes passé à l'écran de connexion une fois, lorsque vous vous connectez, vous vous déplacez vers l'URL spécifiée
.usernameParameter("email") //Demander le nom du paramètre du nom d'utilisateur utilisé pour l'authentification(Cette fois, j'utilise une adresse e-mail)
.passwordParameter("password"); //Demander le nom du paramètre du mot de passe utilisé pour l'authentification
http.logout() //Paramètres de déconnexion
.logoutRequestMatcher(new AntPathRequestMatcher("/logout**")) //Chemin de transition lors de la déconnexion
.logoutSuccessUrl("/login") //Chemin de transition après la déconnexion(Réglez l'écran de connexion ici)
.deleteCookies("JSESSIONID") //Après vous être déconnecté, supprimez l'ID de session stocké dans le cookie
.invalidateHttpSession(true); // true:Désactiver la session après la déconnexion false:Ne désactivez pas la session
}
/**
*Paramètres liés à "l'authentification".<br>
*Paramètres du "Service Détails de l'utilisateur" pour acquérir des utilisateurs authentifiés<br>
*Paramètres "Password Encoder" utilisés pour la vérification du mot de passe
*
* @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder)
*/
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(memberDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
}
/**
* <pre>
*Renvoie l'implémentation au hachage avec l'algorithme bcrypt.
*En spécifiant cela, lors du hachage du mot de passe et de la confirmation de correspondance
* @Autowired
* private PasswordEncoder passwordEncoder;
*Si vous écrivez, ce sera DI.
* </pre>
* @Un objet d'implémentation haché avec l'algorithme return bcrypt
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Une classe de service pour acquérir des informations utilisateur et effectuer une authentification de connexion sur la base de l'adresse e-mail entrée à partir du navigateur. Le code source est le suivant.
UserDetailsServiceImpl.java
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
/**Référentiel pour obtenir des informations de DB*/
@Autowired
private UserRepository userRepository;
/*
* (non-Javadoc)
*
* @see org.springframework.security.core.userdetails.UserDetailsService#
* loadUserByUsername(java.lang.String)Rechercher dans la base de données, configurer et renvoyer les informations de connexion.
*/
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
User user = userRepository.findByMailAddress(email);
if (user == null) {
throw new UsernameNotFoundException("L'e-mail n'est pas enregistré.");
}
//Exemple d'autorisation
Collection<GrantedAuthority> authorityList = new ArrayList<>();
authorityList.add(new SimpleGrantedAuthority("ROLE_USER")); //Accorder des privilèges d'utilisateur
// if(member.isAdmin()) {
// authorityList.add(new SimpleGrantedAuthority("ROLE_ADMIN")); //Accorder des privilèges d'administrateur
// }
return new LoginUser(user, authorityList);
}
}
LoginUser.java
/**
*Entité qui stocke les informations de connexion de l'administrateur.
*
*/
public class LoginUser extends User {
private static final long serialVersionUID = 1L;
/**Informations de l'utilisateur*/
private final com.example.domain.User user;
/**
*En plus des informations normales de l'administrateur, définissez les rôles d'autorisation.
*
* @param Administrator Informations sur l'administrateur
* @param AuthorityList Liste contenant les informations d'autorité
*/
public LoginUser(com.example.domain.User user, Collection<GrantedAuthority> authorityList) {
super(user.getEmail(), user.getPassword(), authorityList);
this.user = user;
}
public com.example.domain.User getUser() {
return user;
}
}
Un référentiel pour rechercher des utilisateurs par adresse e-mail. Il est nécessaire de créer une classe de domaine utilisateur séparément, mais cette fois, elle est omise.
UserRepository.java
public class UserRepository {
@Autowired
private NamedParameterJdbcTemplate template;
private static final RowMapper<User> USER_ROW_MAPPER = (rs, i) -> {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
user.setPassword(rs.getString("password"));
user.setZipcode(rs.getString("zipcode"));
user.setAddress(rs.getString("address"));
user.setTelephone(rs.getString("telephone"));
return user;
};
/**
*Obtenez 1 information utilisateur à partir de l'adresse e-mail
* @param email
* @return List<User>
*/
public User findByMailAddress(String email) {
String sql = "select id,name,email,password,zipcode,address,telephone from users where email = :email";
SqlParameterSource param = new MapSqlParameterSource().addValue("email", email);
List<User> userList = template.query(sql, param, USER_ROW_MAPPER);
if(userList.size() == 0) {
return null;
}
return userList.get(0);
}
Remarque 1: lors de la connexion avec Spring Security implémenté, les informations de mot de passe stockées dans la base de données doivent être hachées. Consultez un autre article pour le hachage de mot de passe lors de l'enregistrement des informations utilisateur.
Recommended Posts