Я установил сервис 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)ошибка должна отображаться пользователю).