web:framework:spring:security

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
web:framework:spring:security [2023/12/05 10:16] – [Rôles et authorities] jcheronweb:framework:spring:security [2023/12/05 12:12] (Version actuelle) – [Déclaration du service] jcheron
Ligne 167: Ligne 167:
     public void encodePassword(User user) {     public void encodePassword(User user) {
         user.setPassword(pEncoder.encode(user.getPassword()));         user.setPassword(pEncoder.encode(user.getPassword()));
-    } 
- 
-    public User createUser(String login, String password) { 
-        User user = new User(); 
-        user.setLogin(login); 
-        user.setPassword(password); 
-        encodePassword(user); 
-        user.setRole(getRole("USER")); 
-        return uRepo.save(user); 
     }     }
 } }
Ligne 208: Ligne 199:
  
 <wrap important>Le **Bean** UserDetailsService est marqué comme **@Primary** pour être le premier choisi par Spring lors de l'injection.</wrap> <wrap important>Le **Bean** UserDetailsService est marqué comme **@Primary** pour être le premier choisi par Spring lors de l'injection.</wrap>
 +
 +==== Déclaration du service ====
 +
 +<sxh java;title:WebSecurityConfig>
 +@Configuration
 +@EnableWebSecurity
 +public class WebSecurityConfiguration {
 +    ...
 +    @Bean
 +    public DaoAuthenticationProvider authenticationProvider(UserDetailsService userService) {
 +        DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
 +        auth.setUserDetailsService(userService);
 +        auth.setPasswordEncoder(getPasswordEncoder());
 +        return auth;
 +    }
 +}
 +</sxh>
 +
  
 === Création d'utilisateur === === Création d'utilisateur ===
 Ne pas oublier de hasher le password User avant création : Ne pas oublier de hasher le password User avant création :
  
-<sxh kotlin;title:InitController;highlight:19+<sxh java;title:DbUserService
-@Controller +@Service 
-class InitController { +public class UserService implements UserDetailsService {
-    @Autowired +
-    lateinit var dbUserService: UserDetailsService+
  
-    @Autowired +    ...
-    lateinit var userRepository: UserRepository +
- +
-    @Autowired +
-    lateinit var roleRepository: RoleRepository+
  
-    @RequestMapping("/init/{username}"+    public User createUser(String login, String password) { 
-    fun createUser(@PathVariable username:String):String +        User user = new User(); 
-        val user=User() +        user.setLogin(login); 
-        user.username=username +        user.setPassword(password); 
-        user.email=username.lowercase()+"@gmail.com" +        encodePassword(user); 
-        user.role="MANAGER" +        user.setRole(getRole("ROLE_USER")); 
-        user.password="1234" +        return uRepo.save(user);
-        (dbUserService as DbUserService).encodePassword(user+
-        userRepository.save(user) +
-        return "redirect:/"+
     }     }
 } }
 </sxh> </sxh>
  
 +=== Récupération Utilisateur connecté ===
 +Récupération de l'utilisateur connecté en tant que **ModelAttribute** pour utilisation dans les vues :
 +
 +<sxh java>
 +@ControllerAdvice
 +public class MainAdvice {
 +    @ModelAttribute("activeUser")
 +    public User activeUser(Authentication auth) {
 +        return (auth == null) ? null : (User) auth.getPrincipal();
 +    }
 +}
 +</sxh>
 ==== Login form personnalisée ==== ==== Login form personnalisée ====
  
Ligne 251: Ligne 263:
 Ajouter une route pour le **login** Ajouter une route pour le **login**
  
-<sxh kotlin:AppConfig> +<sxh java:AppConfig> 
-class AppConfig WebMvcConfigurer { +@Configuration 
-    override fun addViewControllers(registry: ViewControllerRegistry) { +public class WebConfiguration implements WebMvcConfigurer { 
-        registry.addViewController("/login").setViewName("loginForm")+    
 +    @Override 
 +    public void addViewControllers(ViewControllerRegistry registry) { 
 +     registry.addViewController("/login").setViewName("/forms/loginForm");
     }     }
 } }
Ligne 261: Ligne 276:
 Modifier la configuration dans **WebSecurityConfig** : Modifier la configuration dans **WebSecurityConfig** :
  
-<sxh kotlin;title:WebSecurityConfig>+<sxh java;title:WebSecurityConfiguration>
 @Configuration @Configuration
 @EnableWebSecurity @EnableWebSecurity
-@EnableMethodSecurity( 
-        prePostEnabled = true, proxyTargetClass = true 
-) 
 public class WebSecurityConfiguration { public class WebSecurityConfiguration {
  
Ligne 319: Ligne 331:
 Il est possible de définir les authorities de manière hiérarchique : Il est possible de définir les authorities de manière hiérarchique :
  
-<sxh kotlin>+<sxh java>
     @Bean     @Bean
-    fun roleHierarchy(): RoleHierarchyImpl? +    static RoleHierarchy roleHierarchy() { 
-        val roleHierarchy = RoleHierarchyImpl() +        RoleHierarchyImpl hierarchy new RoleHierarchyImpl(); 
-        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_STAFF > ROLE_USER > ROLE_GUEST") +        hierarchy.setHierarchy("ROLE_ADMIN > ROLE_REDACTOR\n ROLE_REDACTOR > ROLE_USER"); 
-        return roleHierarchy+        return hierarchy;
     }     }
 +
  
     @Bean     @Bean
-    fun expressionHandler(): DefaultWebSecurityExpressionHandler? +    static MethodSecurityExpressionHandler methodSecurityExpressionHandler() { 
-        val expressionHandler = DefaultWebSecurityExpressionHandler() +        DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); 
-        expressionHandler.setRoleHierarchy(roleHierarchy()) +        expressionHandler.setRoleHierarchy(roleHierarchy()); 
-        return expressionHandler+        return expressionHandler;
     }     }
 </sxh> </sxh>
Ligne 344: Ligne 357:
 ==== Configuration des rôles ==== ==== Configuration des rôles ====
  
-<sxh kotlin;title:WebSecurityConfig>+<sxh java;title:WebSecurityConfig>
 @Configuration @Configuration
 @EnableWebSecurity @EnableWebSecurity
-class WebSecurityConfig {+@EnableMethodSecurity( 
 +        prePostEnabled = true, proxyTargetClass = true 
 +
 +public class WebSecurityConfiguration {
  
     @Bean     @Bean
-    @Throws(Exception::class) +    public SecurityFilterChain configure(HttpSecurity http) throws Exception 
-    fun configure(http: HttpSecurity): SecurityFilterChain +        http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests
-        http.authorizeHttpRequests { authorizeHttpRequests -> +                        (req) -> { 
-            authorizeHttpRequests.requestMatchers("/css/**", "/assets/**", "/login/**").permitAll() // (1) +                            req.requestMatchers
-            authorizeHttpRequests.requestMatchers("/admin/**").hasRole("ROLE_ADMIN") // (2) +                                            AntPathRequestMatcher.antMatcher("/css/**"), 
-            authorizeHttpRequests.requestMatchers("/user/**").hasAuthority("USER") // (3) +                                            AntPathRequestMatcher.antMatcher("/assets/**"), 
-            authorizeHttpRequests.requestMatchers("/staff/**").hasAnyAuthority("USER","ADMIN","MANAGER") // (4) +                                            AntPathRequestMatcher.antMatcher("/login/**") 
-            authorizeHttpRequests.anyRequest().authenticated() // (5) +                                    ) 
-        +                                    .permitAll(); 
-        return http.build()+                            req.requestMatchers(AntPathRequestMatcher.antMatcher("/admin/**")).hasRole("ADMIN")// (2) 
 +                            req.requestMatchers(AntPathRequestMatcher.antMatcher("/user/**")).hasAuthority("USER")// (3) 
 +                            req.requestMatchers(AntPathRequestMatcher.antMatcher("/staff/**")).hasAnyAuthority("USER", "ADMIN", "MANAGER")// (4) 
 +                            req.anyRequest().authenticated()// (5) 
 +                        } 
 +                ); 
 +        return http.build();
     }     }
 } }
Ligne 366: Ligne 388:
 ^Méthode ^ Description ^ ^Méthode ^ Description ^
 | 1 - **permitAll** | Pas de sécurisation sur les urls commençant par **/css**, **/assets**, **/login**. | | 1 - **permitAll** | Pas de sécurisation sur les urls commençant par **/css**, **/assets**, **/login**. |
-| 2 - **hasRole** | Les utilisateurs ayant le rôle **ROLE_ADMIN** peuvent accéder aux urls commençant par **/admin**. |+| 2 - **hasRole** | Les utilisateurs ayant le rôle **ADMIN** peuvent accéder aux urls commençant par **/admin**. |
 | 3 - **hasAuthority** | Les utilisateurs ayant l'authority **USER** peuvent accéder aux urls commençant par **/user**. | | 3 - **hasAuthority** | Les utilisateurs ayant l'authority **USER** peuvent accéder aux urls commençant par **/user**. |
 | 4 - **hasAnyAuthority** | Les utilisateurs ayant l'une des authorities **USER**, **ADMIN** ou **MANAGER** peuvent accéder aux urls commençant par **/staff**. | | 4 - **hasAnyAuthority** | Les utilisateurs ayant l'une des authorities **USER**, **ADMIN** ou **MANAGER** peuvent accéder aux urls commençant par **/staff**. |
Ligne 376: Ligne 398:
 === Activation === === Activation ===
  
-<sxh kotlin;title:WebSecurityConfig;highlight:[3-7]>+<sxh java;title:WebSecurityConfig;highlight:[3-7]>
 @Configuration @Configuration
 @EnableWebSecurity @EnableWebSecurity
Ligne 384: Ligne 406:
     jsr250Enabled = true     jsr250Enabled = true
 ) )
-class WebSecurityConfig {+public class WebSecurityConfiguration {
     ...     ...
 } }
Ligne 398: Ligne 420:
 == @Secured == == @Secured ==
  
-<sxh kotlin>+<sxh java>
     @Secured("ROLE_ADMIN")     @Secured("ROLE_ADMIN")
-    fun adminOnly():String +    public String adminOnly() { 
-        return "admin"+        return "admin";
     }     }
 </sxh> </sxh>
  
 == @RolesAllowed == == @RolesAllowed ==
-<sxh kotlin>+<sxh java>
     @RolesAllowed(value = [ "ROLE_USER", "ROLE_MANAGER"])     @RolesAllowed(value = [ "ROLE_USER", "ROLE_MANAGER"])
-    fun userOrManager():String +    public String userOrManager() { 
-        return "userOrManager"+        return "userOrManager";
     }     }
 </sxh> </sxh>
Ligne 419: Ligne 441:
   * En testant éventuellement les paramètres passés.   * En testant éventuellement les paramètres passés.
  
-<sxh kotlin>+<sxh java>
     @PreAuthorize("has_role('ROLE_VIEWER')")     @PreAuthorize("has_role('ROLE_VIEWER')")
-    fun getUsernameInUpperCase():String=getUserName().upperCase()+    public String getUsernameInUpperCase() 
 +        return getUserName().upperCase()
 +    }
 </sxh> </sxh>
  
Ligne 428: Ligne 452:
 <sxh kotlin> <sxh kotlin>
     @PreAuthorize("#username == authentication.principal.username")     @PreAuthorize("#username == authentication.principal.username")
-    fun getRoles(username:String):List<String> {+    public List<String> getRoles(username:String) {
         ...         ...
     }     }
Ligne 441: Ligne 465:
 <sxh kotlin> <sxh kotlin>
     @PostAuthorize("returnObject.username == authentication.principal.nickName")     @PostAuthorize("returnObject.username == authentication.principal.nickName")
-    fun loadUserDetail(username:String):CustomUser +    public CustomUser loadUserDetail(String username) { 
-        return userRoleRepository.loadUserByUserName(username)+        return userRoleRepository.loadUserByUserName(username);
     }     }
 </sxh> </sxh>
Ligne 461: Ligne 485:
 La protection csrf est activée par défaut dans **Spring security** La protection csrf est activée par défaut dans **Spring security**
 </wrap> </wrap>
 +
 +Mettre éventuellement une exception pour la console H2 (mais la console H2 n'a aucune raison d'être activée en production) :
 +
 +<sxh java;gutter:false>
 +req.csrf(csrf->csrf.ignoringRequestMatchers(toH2Console()))
 +</sxh>
  
 === Intégration dans les vues === === Intégration dans les vues ===
Ligne 482: Ligne 512:
 </form> </form>
 </sxh> </sxh>
 +
 +
 +<wrap important>Attention à la route **/logout**, elle devra être accédée uniquement via un POST, qui devra inclure le token CSRF.</wrap>
  
  
  • web/framework/spring/security.1701767814.txt.gz
  • Dernière modification : il y a 6 mois
  • de jcheron