Préparation à la certification professionnelle du printemps. Sécurité printanière

Cet article est une traduction de l'article de préparation à la certification Spring Professional .


Il couvrira le sujet de Spring Security et les principales questions à ce sujet.


Il peut également être utilisé pour préparer un entretien.


↓ D'autres articles sont disponibles sur les liens de la table des matières ↓


Table des matières
  1. Injection de dépendance, conteneur, IoC, haricots
  2. AOP (programmation orientée aspect)
  3. JDBC, transactions, JPA, données de printemps
  4. Botte de printemps
  5. Spring mvc
  6. Sécurité printanière
  7. REPOS
  8. Test




Questions elles-mêmes:


Qu'est-ce que l'authentification et l'autorisation?

L'authentification est le processus de vérification de l'utilisateur d'un système informatique.
Voici comment cela se passe au printemps:


  1. Le mot de passe et le nom d'utilisateur résultants sont convertis en une instance de UsernamePasswordAuthenticationToken . Il implémente l'interface d' authentification .
  2. Le jeton est transmis à l'objet AuthenticationManager pour vérification
  3. En cas de succès, AM renvoie un objet d' Authentication rempli
  4. Le contexte de sécurité est défini en appelant SecurityContextHolder.getContext().setAuthentication(...)

L'autorisation est le processus de vérification que l'utilisateur a le rôle requis pour entreprendre une action. Lors de l'autorisation, il est vérifié si vous disposez des droits appropriés pour accéder à la ressource.


Processus:


  1. Par le principal (principal) de l'utilisateur, son rôle est affiché
  2. Rôle utilisateur comparé au rôle de ressource

D'abord, l'authentification a lieu, puis l'authentification.


Comment fonctionne la sécurité en interne?
  • Utilisation de proxys Spring AOP héritant de la classe AbstractSecurityInterceptor.


    Il est utilisé pour les méthodes qui appellent l'autorisation.


  • L'infrastructure Web de sécurité est basée sur des filtres de servlet.



La première étape consiste à configurer le filtre DelegatingFilterProxy . Il délègue la demande à FilterChainProxy .


FilterChainProxy est un bean qui accepte un ou plusieurs SecurityFilterChain dans le constructeur.


SeccurityFilterChain compare l'URL dans la demande avec une liste de filtres.



Fonctionnalités clés impliquées dans Spring Security

SecurityContextHolder - contient et fournit l'accès au SecurityContext dans l'application.


SecurityContext - l'implémentation par défaut de Spring Security contenant l'objet Authentication.


Authentication - fournit un jeton pour une demande d'authentification ou pour un principal qui s'est authentifié. Il contient également une liste des pouvoirs auxquels le mandant a accès.


GrantedAuthority - Contient l'autorité accordée au principal GrantedAuthority .


UserDetails - contient des informations sur l'utilisateur: mot de passe, connexion, autorisations. Ces informations sont utilisées pour créer un objet d'authentification après une authentification réussie.


UserDetailsService - ce service récupère les informations sur l'utilisateur dans le référentiel (mémoire programme, base de données, etc.) et les place dans UserDetails.


Qu'est-ce qu'un filtre proxy délégué?

La classe DelegatingFilterProxy est une classe qui implémente l'interface javax.Servlet.Filter .


Il s'agit d'un filtre spécial qui délègue le travail à d'autres beans, qui sont également des filtres.


Qu'est-ce que la chaîne de filtres de sécurité?

La chaîne de filtres implémente l'interface SecurityFilterChain . L'implémentation fournie par Spring Security est DefaultSecurityFilterChain.


Le constructeur DSFC accepte plusieurs paramètres. Le premier paramètre est l'appariement des requêtes. Les paramètres restants sont des filtres qui implémentent l'interface servlet.Filter. Voici tous les filtres acceptés par DSFC:


  • ChannelProcessingFilter
  • SecurityContextPersistenceFilter
  • ConcurrentSessionFilter
  • Tout auth. filtre: UserNamePasswordAuthenticationFilter / CasAythenticationFilter / BasicAuthenticationFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RemeberMeAuthenticationFilter
  • AnonymusAuthenticationFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor

Qu'est-ce qu'un contexte de sécurité?

L'objet principal est un SecurityContextHolder . Il s'agit de l'emplacement où les détails sur le contexte de sécurité actuel sont stockés, par exemple, les détails du principal qui utilise actuellement l'application. Par défaut, ThreadLocal utilisé pour le stockage.


 // SecurityContext SecurityHolderContext.getContext() 

L'objet renvoyé par la méthode getContext() est SecurityContext . Il vous permet de recevoir et de configurer un objet d' Authentication .


Authentication représente les propriétés suivantes:


  • La collecte des pouvoirs accordés au mandant
  • Données d'identification de l'utilisateur (login, mot de passe)
  • Détails - ajouter. si nécessaire. Peut être nul
  • Directeur
  • Indicateur d'authentification - variable booléenne qui indique si le principal a réussi le test

Comment définir une interception de clics utilisateur sur des URL spécifiques?
 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() //    /resources .antMatchers("/resources/**").permitAll() //      2  .antMatchers("/").hasAnyRole("ANONYMOUS", "USER") .antMatchers("/login)*").hasAnyRole("ANONYMOUS", "USER") .antMatchers("/logoutr").hasAnyRole("ANONYMOUS", "USER") //      ADMIN .antMatchers("iadmin/*").hasRole("ADMIN") .antMatchers("/events/").hasRole("ADMIN") } 

Que signifie * dans les méthodes antMatchers et mvcMatchers ()?

Cette expression signifie «tout».


Il existe 2 types:


  • * - intercepte uniquement au niveau auquel il est utilisé.


    Par exemple, le modèle «/ commandes / *» vérifiera les droits de l'utilisateur si l'utilisateur suit


    / commandes / étrangers ou / commandes / 1, mais pas / commandes / étrangers / 1.


  • ** - intercepte à tous les niveaux.
    Toutes les demandes seront vérifiées, / commandes / étrangers, / commandes / 1, / commandes / étrangers / 1.



Pourquoi mvcMatcher est-il plus sûr qu'antMatcher?

Parce que antMatcher(“/service”) mappe le chemin de demande uniquement vers “/service” , tandis que mvcMatcher(“/service”) mappe vers “/service” , “/service.html” , «/service.abc» .


Spring prend-il en charge le hachage de mot de passe? Qu'est-ce que le sel?

Oui, c'est vrai. Il existe une interface PasswordEncoder pour le hachage, qui ne contient qu'une seule méthode:


static PasswordEncoder createDelegatingPasswordEncoder() , qui renvoie le DelegatePasswordEncoder par défaut.


Salt est utilisé pour calculer la valeur de hachage du mot de passe. Il s'agit d'une séquence de nombres aléatoires qui sont utilisés pour convertir un mot de passe texte en hachage. Le sel est stocké sous forme claire à côté du mot de passe de hachage et peut être utilisé plus tard lors de la conversion d'un mot de passe propre en hachage avec une nouvelle connexion utilisateur.


Pourquoi avez-vous besoin d'une protection pour les méthodes? Comment l'installer?

Spring Security prend en charge la protection des méthodes individuelles dans les beans (par exemple, dans les contrôleurs). Il s'agit d'une couche de protection supplémentaire pour l'application.


Il doit être spécifié explicitement à l'aide de l'annotation @EnableGlobalMethodSecurity .


Que fait l'annotation @RolesAllowed?

Cette annotation est basée sur le JSR-250.
@RolesAllowed vous permet de configurer l'accès aux méthodes (par exemple, dans la classe de contrôleur) à l'aide de rôles.
Exemple: @RolesAllowed(“ADMIN”) n'autorisera que les utilisateurs avec le rôle ADMIN


Pour l'utiliser, vous devez définir @EnableGlobalMethodSecurity(jsr250Enabled=true) sur la classe @Configuration + vous avez besoin que cette annotation soit dans le chemin de classe.


Parlez-nous de @PreAuthorize

@PreAuthorize vous permet de configurer l'accès à la méthode à l'aide de SpEL.
Pour l'utiliser, vous devez définir @EnableGlobalMethodSecurity(prePostEnabled=true)


Comment toutes ces annotations sont-elles mises en œuvre?

La fonctionnalité de bout en bout est utilisée à l'aide de Spring AOP (objets proxy).

Source: https://habr.com/ru/post/fr470786/


All Articles