2017-09-29 1 views
0

Je souhaite combiner des annotations basées sur des rôles et une configuration d'autorisation basée sur des modèles.Sécurité de printemps: comment faire en sorte que les spécifications de rôle basées sur les annotations aient priorité sur les spécifications de rôle basées sur des modèles

Je souhaite que l'autorisation basée sur un modèle soit la "solution de repli au cas où aucune annotation n'est spécifiée".

Un exemple d'un critère d'évaluation de la méthode annotée:

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_USER')") 
@RequestMapping(
    method = RequestMethod.POST, 
    headers = "Accept=application/json", 
    path="publicApi/doWork") 
public void doWork() { 
    ... 
} 

Et ma configuration d'autorisation basée sur des modèles ressemble:

@Configuration 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
@EnableWebSecurity 
// specifies actuator endpoints should be secured by this config 
@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    private void configureEndpointRoles(HttpSecurity http) throws Exception { 
    http.authorizeRequests(). 
     antMatchers(anonymousUrlPatterns()).permitAll(). 
     antMatchers("/publicApi/**").access("hasAnyRole('ROLE_ADMIN')"). 
     anyRequest().denyAll(); 
    ; 
    } 
} 

Voilà comment je veux le à travailler:

  • Si une URL de point de terminaison correspond à l'un des "anonymousUrlPatterns" - autoriser.
  • Si un point de terminaison correspond au modèle "publicApi" et est annoté avec @PreAuthorize, utilisez la définition de l'annotation pour décider si l'utilisateur peut y accéder (dans ce cas, l'utilisateur a besoin du rôle ADMIN ou USER).
  • Si un point de terminaison correspond au modèle "publicApi" mais n'est pas annoté, l'utilisateur doit avoir un rôle ADMIN pour y accéder.
  • Si le point de terminaison ne correspond à aucun des refus ci-dessus.

Comment pourrais-je définir ce comportement?

Avec la configuration ci-dessus comme spécifié, la configuration basée sur des modèles a la priorité et l'invocation du critère d'évaluation est refusé (je ne sais pas si la configuration basée sur des modèles prend priorité ou si le printemps est de les combiner en quelque sorte?)

version Spring - 4.2.3


Mise à jour: J'ai essayé de mettre à jour le EnableGlobalMethodSecurity à:

@EnableGlobalMethodSecurity(
    prePostEnabled = true, 
    order = Ordered.HIGHEST_PRECEDENCE) 

Mais ce n'a pas semblé changer le comportement.

+1

autant que je sache, il est impossible. Peut-être que vous pouvez écrire une sous-classe de ['GlobalMethodSecurityConfiguration'] (https://docs.spring.io/autorepo/docs/spring-security/4.1.3.RELEASE/apidocs/org/springframework/security/config/annotation/method /configuration/GlobalMethodSecurityConfiguration.html) et renvoie un [[MethodSecurityMetadataSource'] personnalisé (https://docs.spring.io/autorepo/docs/spring-security/4.1.3.RELEASE/apidocs/org/springframework/security/access /method/MethodSecurityMetadataSource.html). Mais vous ne pouvez pas configurer votre valeur par défaut dans la sécurité Web, vous avez utilisé une autre source. – dur

Répondre

0

Selon le commentaire de @dur, il semble que vous ne pouvez pas le faire avec une configuration de base. Dans la stratégie Spring Security AccessDecisionManager par défaut, le vote «Non» de la règle basée sur un modèle entraîne le refus de l'appel global.

Il semble que le comportement que je veux écrire impliquera une logique de gestion de décision personnalisé, quelque chose comme: http://www.baeldung.com/spring-security-custom-voter