Lors de la définition de nouvelles ressources Spring Boot REST, j'ai tendance à oublier de créer également une configuration de sécurité Spring pour leurs modèles d'URL.
Comment puis-je, par défaut, refuser l'accès à toutes les URL et n'autoriser l'accès qu'à des modèles d'URL explicitement configurés? (J'utilise .hasRole
pour autoriser l'accès). Je souhaite éviter autant que possible les failles de sécurité involontaires.
Disons que j'ai trois REST ressources: /jobs
, /desks
et /salary
. Mon code actuel pourrait ressembler à ceci:
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/jobs")
.hasRole("my_user")
.antMatchers(HttpMethod.GET, "/desks")
.hasRole("my_user");
Mais actuellement, l'accès à l'URL /salary
est fourni à tout le monde (car il n'est pas encore configuré)!
Vous pouvez refuser toutes les demandes par défaut avec: .anyRequest().denyAll()
Et autoriser explicitement les demandes avec .hasRole
Le contrôle d'accès basé sur les expressions de Spring a une expression denyAll
qui est toujours évaluée à false
.
Vous pouvez donc utiliser cette méthode denyAll
pour refuser l'accès à tout, puis autoriser peut-être l'accès à une ou plusieurs URL via hasRole
:
http.authorizeRequests().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();
Ainsi, par exemple, les utilisateurs disposant d’un accès ADMIN pourront accéder à n’importe quelle page commençant par /admin
. Et puis, il refusera l'accès à toutes les autres pages. Notez que l'ordre est important car si vous mettez .antMatchers("/**").denyAll()
first, il refusera l'accès à tout et ignorera le reste de votre expression.
Ou bien, vous pouvez utiliser permitAll()
pour un certain modèle d'URL:
http.authorizeRequests().antMatchers("/users/**").permitAll().antMatchers("/**").denyAll();
Il suffit de noter que vous devrez peut-être également autoriser l’accès à un autre moyen de connexion afin que le système puisse laisser une personne se connecter avec un rôle spécifique. la (les) page (s) d’administration et niez toutes les autres, puis quelque chose comme:
http.authorizeRequests().antMatchers("/login").permitAll().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();
anyRequest().denyAll()
pour refuser toutes les demandes par défaut et .hasRole
pour autoriser explicitement les demandes