Безопасность Swagger + Spring - скрыть методы, основанные на ролях

У меня есть api, у которого есть разные потребители. Я бы хотел, чтобы они получили соответствующую документацию на основе своих ролей в безопасности spring.

например

Операция Api A ограничена ролью A и ролью B

Операция Api B ограничена ролью B

Операция Api C открыта для всех

Я использую springfox, spring 4, spring отдых, безопасность

Я знаю, что есть аннотация @ApiIgnore, которую можно было бы использовать.

Возможно ли это?

Ответ 1

Blockquote Вы можете использовать ниже фрагмент кода в вашем файле конфигурации безопасности, и вам необходимо расширить функцию GlobalMethodSecurityConfiguration.

@Autowired   Auth2ServerConfiguration auth2ServerConfiguration;

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

в API используется ниже код следующим образом

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

Ответ 2

Возможно, вы уже это видели, но сама SpringFox предоставляет механизм для настройки безопасности. См. этот раздел в официальной документации SpringFox и этот раздел для примера (примечания № 14 и № 15).

Если вы открыты, чтобы позволить различным пользователям просматривать API-интерфейсы, но все еще не в состоянии выполнять API, вы можете рассмотреть возможность добавления @Secured аннотация в API с соответствующими ролями.

Например:

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

Убедитесь, что вы добавили @EnableGlobalMethodSecurity (securedEnabled = true) в свой класс SecurityConfig (или что-то еще, что у вас есть) для работы @Secured.