2017-01-03 3 views
11

J'ai une API qui a différents consommateurs. Je voudrais qu'ils obtiennent des documents pertinents en fonction de leurs rôles dans la sécurité du printemps.Sécurité Swagger + Spring - Cacher les méthodes basées sur les rôles

Par exemple,

opération Api A est resserrée au rôle de A et rôle B

opération Api B est resserrée au rôle de B

opération Api C est ouvert à tous

Je suis using springfox, spring 4, spring repos, sécurité

Je sais qu'il y a une annotation appelée @ApiIgnore, qui pourrait peut-être être utilisée.

Est-ce possible?

+0

Comment '@ ApiIgnore' être utile à votre cas d'utilisation? Il empêche simplement l'affichage de certaines ressources ... Si vous utilisez un modèle Spring Security avec des tables pour stocker les rôles, les utilisateurs, les autorisations, etc., vous pouvez créer un point de terminaison pour récupérer ces données. Créez tout cela en tant que ressources car un mappage Swagger ne fonctionnerait pas parce que vous avez vraiment besoin d'annotations Repos autour d'eux. – bosco

+0

Eh bien je voulais dire, peut-être que je pourrais écrire ma propre annotation qui utilisait apiignore où les rôles n'étaient pas présents. ou quelque chose comme ça. –

Répondre

-4

Vous avez peut-être déjà vu cela, mais SpringFox lui-même fournit un mécanisme pour configurer la sécurité. Voir this section dans la documentation officielle de SpringFox, et this section pour un exemple (notez les points 14 et 15).

Si vous êtes autorisé à autoriser différents clients à visualiser les API, mais que vous ne parvenez toujours pas à exécuter les API, vous pouvez ajouter l'annotation @Secured aux API avec les rôles appropriés.

Par exemple:

@Secured ({"ROLE_A", "ROLE_B") 
@RequestMapping ("/open/to/both") 
public String operationA() { 
    // do something 
} 

@Secured ("ROLE_B") 
@RequestMapping ("/open/to/b/only") 
public String operationB() { 
    // do something 
} 

// No @Secured annotation here 
@RequestMapping ("/open/to/all") 
public String operationC() { 
    // do something 
} 

Assurez-vous que vous avez ajouté dans votre @EnableGlobalMethodSecurity (securedEnabled = true)SecurityConfig classe (ou quel que soit celui que vous avez) pour @Secured travailler.

+0

Merci pour votre réponse, mais cela ne résout pas mon problème. Je sécurise déjà mon application avec des rôles, je veux que la documentation en tienne compte. –

+0

@EspenSchulstad Avez-vous trouvé une solution à votre problème? Merci – drenda

-2

Blockquote Vous pouvez utiliser ci-dessous l'extrait de code dans votre fichier de configuration de sécurité et vous devez étend GlobalMethodSecurityConfiguration.

@Autowired Auth2ServerConfiguration auth2ServerConfiguration;

@Override 
    protected MethodSecurityExpressionHandler createExpressionHandler() { 
     return new OAuth2MethodSecurityExpressionHandler(); 
    } 

dans l'utilisation de l'API ci-dessous le code comme suit

@PreAuthorize("hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')") 
@Transactional(readOnly = true) 
public @ResponseBody ModelAndView abc() { 
    //do something 
    }