2017-01-03 34 views
11

Mam api, które ma różnych konsumentów. Chciałbym, aby dostali odpowiednią dokumentację na podstawie ich roli w ochronie wiosennej.Swagger + Spring security - Ukryj metody oparte na rolach

Np

Api operacja A jest zwężone do Role A i rola B

pracy Api B jest zwężona do Role B

operacja Api C jest otwarty dla wszystkich

jestem używając springfox, spring 4, spring sphere, security

Wiem, że istnieje adnotacja o nazwie @ApiIgnore, która może być wykorzystana.

Czy to w ogóle możliwe?

+0

Jak '@ ApiIgnore' być przydatne do przypadku użycia? Zapobiega wyświetlaniu niektórych zasobów ... Jeśli używasz modelu Spring Security z tabelami do przechowywania ról, użytkowników, uprawnień itp., Możesz utworzyć punkt końcowy, aby pobrać te dane. Stwórz to wszystko jako zasoby, ponieważ mapowanie Swagger nie zadziała, ponieważ potrzebujesz naprawdę Adnotacji odpoczynku wokół nich. – bosco

+0

Miałem na myśli, być może mógłbym napisać własną adnotację, która wykorzystywałaby apiignore tam, gdzie role nie były obecne. czy coś takiego. –

Odpowiedz

-4

Być może już to widziałeś, ale SpringFox sam dostarcza mechanizm konfiguracji bezpieczeństwa. Zobacz this section w oficjalnej dokumentacji SpringFox i this section na przykład (uwaga pkt 14 i 15).

Jeśli jesteś otwarty na to, aby umożliwić innym użytkownikom przeglądanie interfejsów API, ale nadal nie można uruchomić interfejsów API, możesz rozważyć dodanie adnotacji @Secured do interfejsów API z odpowiednimi rolami.

Na przykład:

@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 
} 

Upewnij się, że dodałeś @EnableGlobalMethodSecurity (securedEnabled = true) w swojej klasie SecurityConfig (lub cokolwiek ten, który masz) dla @Secured do pracy.

+0

Dziękuję za odpowiedź, ale to nie rozwiązuje mojego problemu. Już zabezpieczam swoją aplikację rolami, chcę, żeby dokumentacja wzięła to pod uwagę. –

+0

@EspenSchulstad Czy znalazłeś rozwiązanie swojego problemu? Dzięki – drenda

-2

Blockquote Możesz użyć poniższego fragmentu kodu w pliku konfiguracyjnym zabezpieczeń i potrzebujesz rozszerzenia GlobalMethodSecurityConfiguration.

@Autowired Auth2ServerConfiguration auth2ServerConfiguration;

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

w użyciu API poniższym kodzie następująco

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