spring security le userdetailsservice adil...

26
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 renvoie Adil ENAANAI

Upload: others

Post on 22-Mar-2020

30 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 2: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 3: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Authentification par UserDetails@Configuration@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

Page 4: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Authentification par UserDetails@Configuration@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

Page 5: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Authentification par UserDetails@Servicepublic 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

Page 6: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 7: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 8: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security

Créer le modèle « User »

Authentification par UserDetails

@Entitypublic class User {@Id@GeneratedValue(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

Page 9: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 10: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 11: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 12: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Qu'est-ce que OAuth2?

Adil ENAANAI

Page 13: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 14: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Enregistrez votre application sur Google

12

3 4

Adil ENAANAI

Page 15: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Enregistrez votre application sur Google

5

6Adil E

NAANAI

Page 16: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Enregistrez votre application sur Google

67

8

9Adil ENAANAI

Page 17: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 18: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 19: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 20: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 21: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 22: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 23: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 24: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 25: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

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

Page 26: Spring Security Le UserDetailsService Adil ENAANAIlecurseur.e-monsite.com/medias/files/seance6-spring-framework.pdf · Spring framework Spring Security Configuration Spring Security

Spring framework

Spring Security Travail à réaliser

Réaliser l’authentification des utilisateurs via l’interface suivant

À rendre dans une semaine

Adil ENAANAI