Spring Security Le UserDetailsService Adil...
Embed Size (px)
Transcript of Spring Security Le UserDetailsService Adil...

Spring framework
Spring Security
Le UserDetailsService
Authentification par table « User » de la BD
Afin de fournir notre propre service utilisateur, nous devrons implémenter
l’interface UserDetailsService .
Nous allons créer une classe appelée MyUserDetailsService qui remplace la
méthode loadUserByUsername () de l’interface.
Dans cette méthode, nous récupérons l’objet User à l’aide de DAO et, s’il
existe, encapsulons-le dans un objet MyUserPrincipal qui implémente
UserDetails et le renvoieAdil ENAANAI

Spring framework
Spring Security Authentification par UserDetails
SecurityConfig
configure
DaoAuthenticationProvider
userDetailsService
UserDetails
User
Entité User avec les attributs: id, username,
password, active, roles, permissions
La classe myUserPrincipal implémente
l’interface UserDetails avec ses méthodes utiles
et encapsule l’objet User.
La classe MyUserDetailsService implémente
l’interface UserDetailsService et crée l’objet
UserPrincipal.
Dans la méthode configure de la classe
SecurityConfig, on crée un objet
DaoAuthenticationProvider et on l’initialise
par UserDetailsService
Adil ENAANAI

Spring framework
Spring Security Authentification par [email protected]@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate MyUserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {
DaoAuthenticationProvider authProvider= new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);authProvider.setPasswordEncoder(new BCryptPasswordEncoder());
auth.authenticationProvider(authProvider);}
@Overrideprotected void configure(HttpSecurity http) throws Exception {...}}
Adil ENAANAI

Spring framework
Spring Security Authentification par [email protected]@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate MyUserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {...}
@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()
.antMatchers("/index.jsp").permitAll()
.antMatchers("/authors").hasRole("ADMIN")
.antMatchers("/books").hasRole("AUTHOR")
.and().formLogin()
.and().logout().permitAll().logoutUrl("/logout").logoutSuccessUrl("/");}}
Adil ENAANAI

Spring framework
Spring Security Authentification par [email protected] class MyUserDetailsService implements UserDetailsService {@AutowiredUserRepository userRepository;
public MyUserDetailsService(UserRepository userRepository) {this.userRepository = userRepository;}@Overridepublic UserDetails loadUserByUsername(String username) throwsUsernameNotFoundException {return new MyUserPrincipal(userRepository.findByUsername(username));}}
public interface UserRepository extends JpaRepository<User, String>{User findByUsername(String username);
}
Adil ENAANAI

Spring framework
Spring Security
Créer la classe « MyUserPrincipal »
Authentification par UserDetails
public class MyUserPrincipal implements UserDetails {
User user;
public MyUserPrincipal(User user) {this.user = user;}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> authorities=new ArrayList<GrantedAuthority>();
this.user.getPermissionList().forEach(p->{
GrantedAuthority authority=new SimpleGrantedAuthority(p);
authorities.add(authority);
});
this.user.getRoleList().forEach(r->{
GrantedAuthority authority=new SimpleGrantedAuthority("ROLE_"+r);
authorities.add(authority);
});
return authorities;
} //La suite dans la diapositive suivante
Adil ENAANAI

Spring framework
Spring Security
Créer la classe « MyUserPrincipal »
Authentification par UserDetails
@Overridepublic String getPassword() {return this.user.getPassword();}@Overridepublic String getUsername() {return this.user.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return this.user.getActive()==1;}}
Adil ENAANAI

Spring framework
Spring Security
Créer le modèle « User »
Authentification par UserDetails
@Entitypublic class User {@[email protected](strategy = GenerationType.IDENTITY)Long id;@ColumnString username;@ColumnString password;int active;String roles="";String permissions="";public User() {}public User(String username, String password, String roles, String permissions) {this.username = username; this.password = password; this.active = 1; this.roles = roles;this.permissions = permissions;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}
Adil ENAANAI

Spring framework
Spring Security
Créer le modèle « User »
Authentification par UserDetails
public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getActive() {return active;}public void setActive(int active) {this.active = active;}public String getRoles() {return roles;}public void setRoles(String roles) {this.roles = roles;}public String getPermissions() {return permissions;}public void setPermissions(String permissions) {this.permissions = permissions;}public List<String> getRoleList(){List<String> listeroles=new ArrayList<String>();listeroles=Arrays.asList(this.roles.split(","));return listeroles;}public List<String> getPermissionList(){List<String> listepermissions=new ArrayList<String>();listepermissions=Arrays.asList(this.permissions.split(","));return listepermissions;}}
Adil ENAANAI

Spring framework
Spring Security Qu'est-ce que OAuth2?
OAuth (Open Authorization) est un protocole standard ouvert permettant à
une application d'utiliser des informations sur l'utilisateur. En général, il
permet à une application tierce d'accéder à des informations relatives à
l'utilisateur telles que le nom, la date de naissance, l'adresse e-mail ou
d'autres données requises à partir d'une application telle que Facebook.
Google etc. sans donner à l'application tierce le mot de passe de
l'utilisateur. Il se prononce comme oh-auth
Adil ENAANAI

Spring framework
Spring Security Qu'est-ce que OAuth2?
Il y a 3 composants dans le mécanisme OAuth -
Fournisseur OAuth - Il s'agit du fournisseur OAuth, par exemple.
Google, FaceBook etc.
Client OAuth - Il s’agit du site Web sur lequel nous partageons ou
authentifions l’utilisation de nos informations.
Propriétaire - Utilisateur dont la connexion authentifie le partage
d'informations.
Adil ENAANAI

Spring framework
Spring Security Qu'est-ce que OAuth2?
Adil ENAANAI

Spring framework
Spring Security Enregistrez votre application sur Google
L'objectif est de créer un identifiant client et un identifiant secret. Le
serveur d'autorisation identifie votre demande en fonction de cet ID client
et de cette clé secrète.
Adil ENAANAI

Spring framework
Spring Security Enregistrez votre application sur Google
12
3 4
Adil ENAANAI

Spring framework
Spring Security Enregistrez votre application sur Google
5
6Adil E
NAANAI

Spring framework
Spring Security Enregistrez votre application sur Google
67
8
9Adil ENAANAI

Spring framework
Spring Security Configuration Spring Security OAuth2
Outre les dépendances par défaut incluses lors de l'initialisation du projet,
nous avons également besoin des dépendances ci-dessous.
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-jose</artifactId></dependency> Adil E
NAANAI

Spring framework
Spring Security Définir les autorisations
Maintenant, on dispose de notre Client ID et Secret Client code. Allez dans
le fichier « application.properties » et ajouter les deux lignes:
spring.security.oauth2.client.registration.google.clientId=Votre client IDspring.security.oauth2.client.registration.google.clientSecret=Votre code secret
Ensuite, passez à la classe:
@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {
@Overrideprotected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();
}}
Adil ENAANAI

Spring framework
Spring Security Créer la page index
Maintenant, implémentons une page de test - index.html. Comme nous
avons protégé toutes les ressources, chaque fois que nous essayons
d'accéder à index.html, nous serons redirigés vers la page Google OAuth.
Une fois l'authentification réussie, la page index.html sera servie au
Spring.
<!doctype html><html><head>
<title>Exemple</title></head><body>
<h1>Bienvenue</h1></body></html>
Adil ENAANAI

Spring framework
Spring Security Définir un contrôleur
Enfin, un contrôleur
@RestControllerpublic class Controller {@GetMapping("/monespace")public String go() {return "Mon espace";}}
Accéder à l’URL: http://localhost:8080/monespaceAdil ENAANAI

Spring framework
Spring Security Créer une page d’authentification personnalisée
Même si Spring Boot génère pour nous une page de connexion par défaut,
nous souhaitons généralement définir notre propre page personnalisée.
Commençons par configurer une nouvelle URL de connexion pour
l'élément oauth2Login () à l'aide de la méthode loginPage():
Ici, nous avons configuré notre URL
de connexion pour être /oauth_login.
@Overrideprotected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/oauth_login").permitAll().anyRequest().authenticated().and().oauth2Login().loginPage("/oauth_login");
}
Adil ENAANAI

Spring framework
Spring Security Créer une page d’authentification personnalisée
Ensuite, définissons un LoginController avec une méthode qui correspond
à cet URI. On prépare l’authentification par Google et Facebook
@Controllerpublic class LoginController {
@GetMapping("/oauth_login")public String getLoginPage(Model model) {
model.addAttribute("facebook", "oauth2/authorization/facebook");model.addAttribute("google", "oauth2/authorization/google");return "oauth_login";
}}
Noter que oauth_login fait référence à la page oauth_login.html
Aussi, il faut ajouter le code client et le code secret de Facebook facebook dans
le fichier application.properties
Adil ENAANAI

Spring framework
Spring Security Créer une page d’authentification personnalisée
Le fichier de application.properties est le suivant:
spring.security.oauth2.client.registration.google.clientId=code clientspring.security.oauth2.client.registration.google.clientSecret=code secretspring.security.oauth2.client.registration.facebook.client-id=code clientspring.security.oauth2.client.registration.facebook.client-secret=code secret
Pour avoir les codes d’authentification Facebook, il faut aller au site:
https://developers.facebook.com/
Adil ENAANAI

Spring framework
Spring Security Créer une page d’authentification personnalisée
Ensuite, créer la vue oauth_login.html
<!DOCTYPE HTML><html lang="en" xmlns:th="http://www.thymeleaf.org"><head><title>title</title></head><body><h3>Login with:</h3>
<p><a th:href="${facebook}">Facebook</a></p><p><a th:href="${google}">Google</a></p>
</body></html>
Pour utiliser thymeleaf, ajouter la dépendance suivante:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Adil ENAANAI

Spring framework
Spring Security Extraire les données de l’utilisateur authentifié
@GetMapping("/success")public @ResponseBody String success(@AuthenticationPrincipal
OAuth2User user) {System.out.println(user.getAttributes());String nom=user.getAttribute("name");String email=user.getAttribute("email");String photo="<img src="+user.getAttribute("picture")+">";return nom+"<br>"+email+"<br>"+photo;}
Taper l’URL: http://localhost:8080/success#Adil E
NAANAI

Spring framework
Spring Security Travail à réaliser
Réaliser l’authentification des utilisateurs via l’interface suivant
À rendre dans une semaine
Adil ENAANAI