Выполнять API через Swagger-UI, только если пользователь прошел аутентификацию через Spring-Security - PullRequest
0 голосов
/ 25 сентября 2019

Я установил сервис Spring Boot, который можно использовать для вызова API REST как из командной строки, так и через пользовательский интерфейс, разработанный с использованием Swagger-UI.Я хотел защитить сервис от открытого доступа и в результате принудительно установил базовую аутентификацию на нем.

Теперь, когда я пытаюсь открыть html-страницу, содержащую документацию API (созданную с помощью Swagger-UI json), я не могу получить к ней доступ без аутентификации, т.е. без ввода моего имени пользователя и пароля.

Обычная проверка подлинности работает нормально, когда команда передается через командную строку:

При передаче curl -X GET <url>/endpoint -H "accept: application/json" ответным выводом с сервера является: {"timestamp":XYZ,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource","path":"/search"}, который является ожидаемым ответом.

При прохождении curl -X GET <url>/endpoint -H "accept: application/json" -H "authorization: Basic token" я получаю желаемый ответ через терминал.

Для пользовательского интерфейса я должен войти в систему, прежде чем я смог увидеть интерфейс пользовательского интерфейса swagger, который я хочу изменитьтаким образом, я могу предоставить всем пользователям доступ к документации API, но я хочу, чтобы только аутентифицированные пользователи могли генерировать результаты с помощью API через интерфейс пользовательского интерфейса.

Я настроил пользовательский AuthenticationService вследующий формат:

@Configuration
@EnableWebSecurity
public class AuthenticationService extends WebSecurityConfigurerAdapter {

    private static final String AUTHORITIES_BY_USERNAME = "select username, authority from authorities where username = ?";
    private static final String USERS_AS_USERNAME = "select username, password, enabled from sers where username = ?";

    @Autowired
    private DirectoryConfiguration directoryConfiguration;

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .httpBasic()
                .and()
            .authorizeRequests()
                .antMatchers("/index.html")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
            .csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
    {
        DataSource dataSource = directoryConfiguration.dataSource();
        auth.jdbcAuthentication().dataSource(dataSource)
                .authoritiesByUsernameQuery(AUTHORITIES_BY_USERNAME)
                .usersByUsernameQuery(USERS_AS_USERNAME);

    }

}

JS Swagger-UI (соответствующие части) выглядит следующим образом:

{
    "swagger": "2.0",
    "info": {
        "version": "1.0",
        "title": "Directory Service"
    },
    "host": "",
    "basePath": "/",
    "schemes": [
        "http"
    ],
    "consumes": [
        "application/json"
    ],
    "produces": [
        "application/json"
    ],
    "securityDefinitions": {
        "basic_auth": {
            "type": "basic",
            "in": "header"
        }
    },
    "security": [
        {
            "basic_auth": []
        }
    ],
    .
    .
}

Я включил basic_auth, который добавляет заголовок аутентификации к сгенерированному запросу

Чтобы решить мою проблему, я попытался внести изменения в метод protected void configure(HttoSecurity http), но, похоже, это не помогло мне.

Чтотекущий сценарий:

Мне необходимо ввести свои учетные данные для входа в систему, прежде чем я смогу получить доступ к интерфейсу Swagger-UI

Мне нужно следующее:

Я должен иметь доступ к SwaggerUI

После того, как я запустил API-интерфейс, я ввожу свое имя пользователя и пароль на странице SwaggerUI с помощью функции авторизации, которая добавит базовую версию.Заголовок авторизации для моих запросов:

Функциональность авторизации

В случае, если пользователь не авторизуется, у него / нее не должно быть доступа к результатам с помощью API (аутентификация 401)ошибка должна отображаться пользователю).

...