web-dev-qa-db-fra.com

Comment refuser l'accès à toutes les URL par défaut?

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é)!

12
slartidan

Vous pouvez refuser toutes les demandes par défaut avec: .anyRequest().denyAll() Et autoriser explicitement les demandes avec .hasRole

10
max

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();
8
achAmháin

anyRequest().denyAll() pour refuser toutes les demandes par défaut et .hasRole pour autoriser explicitement les demandes

0
MBaev