Java, Spring boot, Swagger и авторизация формы базы - PullRequest
0 голосов
/ 26 сентября 2018

Я создал rest-api с BasicAuthenticationEntryPoint.Выглядит это так:

@Component
public class AuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
            throws IOException, ServletException {
        //response.addHeader("WWW-Authenticate", "Basic realm=" +getRealmName());
        response.addHeader("WWW-Authenticate", "FormBased");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter writer = response.getWriter();
        writer.println("HTTP Status 401 - " + authException.getMessage());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        setRealmName("Marketplace");
        super.afterPropertiesSet();
    }

}

Как вы заметили, я использую заголовок "FormBased", чтобы избежать уродливого окна авторизации браузера.Front-end Angular-приложение использует собственную форму авторизации.Это прекрасно работает, но я также использую Swagger в качестве инструмента самоописания для rest-api.С Swagger и таким заголовком (response.addHeader("WWW-Authenticate", "FormBased");) у меня проблема.Swagger возвращает ошибку 401, потому что браузер не предлагает окно авторизации.Есть ли способ использовать Swagger с заголовком (response.addHeader("WWW-Authenticate", "FormBased");) вместо (response.addHeader("WWW-Authenticate", "Basic realm=" +getRealmName());)?

1 Ответ

0 голосов
/ 02 октября 2018

Я нашел решение этой проблемы.Дело в том, что у меня была неправильная конфигурация безопасности в WebSecurityConfigurerAdapter.Конфигурация защищала любой запрос, подобный этому

http.csrf().disable().authorizeRequests()
        .antMatchers("/api/registration/**").permitAll()
        .antMatchers("/api/dictionary/**").permitAll()
        .antMatchers("/api/common/**").permitAll()
        .antMatchers("/api/advert_public/**").permitAll()
        .antMatchers("/api/company_public/**").permitAll()
        .anyRequest().hasRole(DEFAULT_ROLE)
        .and().httpBasic()
        .authenticationEntryPoint(authEntryPoint);

И таким образом точка входа Swagger также требует логин / пароль.

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

http.csrf().disable().authorizeRequests()
        .antMatchers("/api/advert/**").hasRole(DEFAULT_ROLE)
        .antMatchers("/api/company/**").hasRole(DEFAULT_ROLE)
        .antMatchers("/api/user/**").hasRole(DEFAULT_ROLE)
        .and().httpBasic()
        .authenticationEntryPoint(authEntryPoint);

Как вы могли видеть, здесь нет опции конфигурации, такой как .anyRequest().hasRole(DEFAULT_ROLE)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...