Différences
Ci-dessous, les différences entre deux révisions de la page.
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:21] – [Password encoder] jcheron | web: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(" | ||
- | return uRepo.save(user); | ||
} | } | ||
} | } | ||
Ligne 230: | Ligne 221: | ||
Ne pas oublier de hasher le password User avant création : | Ne pas oublier de hasher le password User avant création : | ||
- | < | + | < |
- | @Controller | + | @Service |
- | class InitController | + | public |
- | @Autowired | + | |
- | lateinit var dbUserService: | + | |
- | | + | |
- | lateinit var userRepository: | + | |
- | | + | |
- | lateinit var roleRepository: | + | |
- | + | user.setLogin(login); | |
- | @RequestMapping("/ | + | user.setPassword(password); |
- | fun createUser(@PathVariable username:String): | + | |
- | | + | user.setRole(getRole("ROLE_USER")); |
- | user.username=username | + | |
- | user.email=username.lowercase()+" | + | |
- | user.role=" | + | |
- | user.password="1234" | + | |
- | (dbUserService as DbUserService).encodePassword(user) | + | |
- | | + | |
- | return " | + | |
} | } | ||
} | } | ||
</ | </ | ||
+ | === Récupération Utilisateur connecté === | ||
+ | Récupération de l' | ||
+ | |||
+ | <sxh java> | ||
+ | @ControllerAdvice | ||
+ | public class MainAdvice { | ||
+ | @ModelAttribute(" | ||
+ | public User activeUser(Authentication auth) { | ||
+ | return (auth == null) ? null : (User) auth.getPrincipal(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
==== Login form personnalisée ==== | ==== Login form personnalisée ==== | ||
Ligne 269: | Ligne 263: | ||
Ajouter une route pour le **login** | Ajouter une route pour le **login** | ||
- | < | + | < |
- | class AppConfig | + | @Configuration |
- | | + | public |
- | registry.addViewController("/ | + | |
+ | | ||
+ | public void addViewControllers(ViewControllerRegistry | ||
+ | registry.addViewController("/ | ||
} | } | ||
} | } | ||
Ligne 279: | Ligne 276: | ||
Modifier la configuration dans **WebSecurityConfig** : | Modifier la configuration dans **WebSecurityConfig** : | ||
- | < | + | < |
@Configuration | @Configuration | ||
@EnableWebSecurity | @EnableWebSecurity | ||
- | @EnableMethodSecurity( | ||
- | prePostEnabled = true, proxyTargetClass = true | ||
- | ) | ||
public class WebSecurityConfiguration { | public class WebSecurityConfiguration { | ||
Ligne 341: | Ligne 335: | ||
static RoleHierarchy roleHierarchy() { | static RoleHierarchy roleHierarchy() { | ||
RoleHierarchyImpl hierarchy = new RoleHierarchyImpl(); | RoleHierarchyImpl hierarchy = new RoleHierarchyImpl(); | ||
- | hierarchy.setHierarchy(" | + | hierarchy.setHierarchy(" |
return hierarchy; | return hierarchy; | ||
} | } | ||
Ligne 363: | Ligne 357: | ||
==== Configuration des rôles ==== | ==== Configuration des rôles ==== | ||
- | < | + | < |
@Configuration | @Configuration | ||
@EnableWebSecurity | @EnableWebSecurity | ||
- | class WebSecurityConfig | + | @EnableMethodSecurity( |
+ | prePostEnabled = true, proxyTargetClass = true | ||
+ | ) | ||
+ | public | ||
@Bean | @Bean | ||
- | | + | |
- | fun configure(http: HttpSecurity): SecurityFilterChain | + | http.csrf(AbstractHttpConfigurer:: |
- | http.authorizeHttpRequests | + | (req) -> { |
- | | + | req.requestMatchers( |
- | | + | AntPathRequestMatcher.antMatcher("/ |
- | | + | AntPathRequestMatcher.antMatcher("/ |
- | | + | AntPathRequestMatcher.antMatcher("/ |
- | | + | ) |
- | } | + | |
- | return http.build() | + | req.requestMatchers(AntPathRequestMatcher.antMatcher("/ |
+ | req.requestMatchers(AntPathRequestMatcher.antMatcher("/ | ||
+ | req.requestMatchers(AntPathRequestMatcher.antMatcher("/ | ||
+ | req.anyRequest().authenticated(); // (5) | ||
+ | } | ||
+ | ); | ||
+ | return http.build(); | ||
} | } | ||
} | } | ||
Ligne 385: | Ligne 388: | ||
^Méthode ^ Description ^ | ^Méthode ^ Description ^ | ||
| 1 - **permitAll** | Pas de sécurisation sur les urls commençant par **/css**, **/ | | 1 - **permitAll** | Pas de sécurisation sur les urls commençant par **/css**, **/ | ||
- | | 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' | | 3 - **hasAuthority** | Les utilisateurs ayant l' | ||
| 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 395: | Ligne 398: | ||
=== Activation === | === Activation === | ||
- | < | + | < |
@Configuration | @Configuration | ||
@EnableWebSecurity | @EnableWebSecurity | ||
Ligne 403: | Ligne 406: | ||
jsr250Enabled = true | jsr250Enabled = true | ||
) | ) | ||
- | class WebSecurityConfig | + | public |
... | ... | ||
} | } | ||
Ligne 417: | Ligne 420: | ||
== @Secured == | == @Secured == | ||
- | < | + | < |
@Secured(" | @Secured(" | ||
- | | + | |
- | return " | + | return " |
} | } | ||
</ | </ | ||
== @RolesAllowed == | == @RolesAllowed == | ||
- | < | + | < |
@RolesAllowed(value = [ " | @RolesAllowed(value = [ " | ||
- | | + | |
- | return " | + | return " |
} | } | ||
</ | </ | ||
Ligne 438: | Ligne 441: | ||
* En testant éventuellement les paramètres passés. | * En testant éventuellement les paramètres passés. | ||
- | < | + | < |
@PreAuthorize(" | @PreAuthorize(" | ||
- | | + | |
+ | return | ||
+ | } | ||
</ | </ | ||
Ligne 447: | Ligne 452: | ||
<sxh kotlin> | <sxh kotlin> | ||
@PreAuthorize("# | @PreAuthorize("# | ||
- | | + | |
... | ... | ||
} | } | ||
Ligne 460: | Ligne 465: | ||
<sxh kotlin> | <sxh kotlin> | ||
@PostAuthorize(" | @PostAuthorize(" | ||
- | | + | |
- | return userRoleRepository.loadUserByUserName(username) | + | return userRoleRepository.loadUserByUserName(username); |
} | } | ||
</ | </ | ||
Ligne 480: | 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** | ||
</ | </ | ||
+ | |||
+ | Mettre éventuellement une exception pour la console H2 (mais la console H2 n'a aucune raison d' | ||
+ | |||
+ | <sxh java; | ||
+ | req.csrf(csrf-> | ||
+ | </ | ||
=== Intégration dans les vues === | === Intégration dans les vues === | ||
Ligne 501: | Ligne 512: | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | |||
+ | <wrap important> | ||