Я использую springfox swagger2, и он работает правильно. Это была просто базовая установка / конфигурация, так как я действительно новичок в чванстве.
Но он доступен всем, у кого есть URL.
Я бы хотел, чтобы он не был доступен для всех, и иметь экран входа в систему (обычная проверка подлинности или проверка подлинности Google) было бы действительно здорово.
Я искал в Интернете, но, похоже, я не могу найти что-то конкретное для springfox-swagger2. Я могу найти некоторые, но, похоже, это для .Net (образцы на основе C#).
Обновлять
Я могу получить доступ к swagger-ui.html, если установлю этот .antMatchers("/swagger-ui.html**").permitAll() в класс SecurityConfig.
Но если я изменю его на .authenticated(), этого не произойдет, и я получаю установленную мной ошибку 401:
{"timestamp":"2018-09-03T06:06:37.882Z","errorCode":401,"errorMessagesList":[{"message":"Unauthorized access"}]}
Кажется, он попадает в точку входа в мою аутентификацию. Если бы я мог сделать только swagger-ui.html (или swagger в целом) доступным только для всех аутентифицированных пользователей (на данный момент и будет основываться на ролях позже).
Я не уверен, нужно ли мне добавить некоторую конфигурацию безопасности на SwaggerConfig.java, поскольку мне нужно только сделать swagger-ui.html доступным для аутентифицированных пользователей (или определенных ролей / полномочий).
Зависимость (pom.xml):
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
Класс конфигурации безопасности
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
@Override
protected void configure(HttpSecurity http) throws Exception {
JWTAuthenticationFilter authenticationFilter =
new JWTAuthenticationFilter(authenticationManager(), appContext);
authenticationFilter.setFilterProcessesUrl("/auth/form");
JWTAuthorizationFilter authorizationFilter =
new JWTAuthorizationFilter(authenticationManager(), appContext);
http
.cors().and().csrf().disable() // no need CSRF since JWT based authentication
.authorizeRequests()
...
.antMatchers("/swagger-ui.html**").authenticated()
...
.anyRequest().authenticated()
.and()
.addFilter(authenticationFilter)
.addFilter(authorizationFilter)
// this disables session creation on Spring Security
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().exceptionHandling().authenticationEntryPoint(new MyAuthenticationEntryPoint());
}
...
}
MyAuthenticationEntryPoint
@Component
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {
private final Logger logger = LoggerFactory.getLogger(MyAuthenticationEntryPoint.class);
@Override
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
AuthenticationException e) {
logger.debug("Pre-authenticated entry point called. Rejecting access");
List<Message> errorMessagesList = Arrays.asList(new Message("Unauthorized access"));
CommonErrorResponse commonErrorResponse =
new CommonErrorResponse(errorMessagesList, HttpServletResponse.SC_UNAUTHORIZED);
try {
String json = Util.objectToJsonString(commonErrorResponse);
httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
httpServletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString());
httpServletResponse.getWriter().write(json);
} catch (Exception e1) {
logger.error("Unable to process json response: " + e1.getMessage());
}
}
}
Конфигурация Swagger
@EnableSwagger2
@Configuration
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(metadata())
.select()
.apis(RequestHandlerSelectors.basePackage("com.iyotbihagay.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo metadata() {
return new ApiInfoBuilder().title("Iyot Bihagay API Documentation")
.description("API documentation for Iyot Bihagay REST Services.").version("1.6.9").build();
}
}
Я думаю, что это возможно с помощью springfox, поскольку я вижу это в другой версии, такой как .net.
Надеюсь, кто-то сможет поделиться с вами светом, как защитить пользовательский интерфейс Swagger (springfox-swagger2).
Кстати, я использую JWT для своих API, и он работает.
Что касается чванства, он работает, если я установил его на permitAll().
Не работает, если поменять на authenticated().
Если он работает с authenticated(), я попытаюсь применить проверки ролей / полномочий.
Спасибо!




Добавьте Spring безопасность в свой проект, создайте «DEVELOPER_ROLE», и пользователь с этой ролью, а затем настройте вашу веб-безопасность, будет выглядеть примерно так:
@Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
//swagger-ui resources
private static final String[] DEVELOPER_WHITELIST = {"/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs"};
//site resources
private static final String[] AUTH_HTTP_WHITELIST = {"/path1", "/path2"}; // allowed
private static final String LOGIN_URL = "/login.html"; // define login page
private static final String DEFAULT_SUCCESS_URL = "/index.html"; // define landing page after successful login
private static final String FAILURE_URL = "/loginFail.html"; // define failed login page/path
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(AUTH_HTTP_WHITELIST).permitAll()
.antMatchers(DEVELOPER_WHITELIST).hasRole("DEVELOPER") // for role "DEVELOPER_ROLE"
.anyRequest()..authenticated()
.and()
.formLogin()
.loginPage(LOGIN_URL)
.defaultSuccessUrl(DEFAULT_SUCCESS_URL)
.failureUrl(FAILURE_URL)
.permitAll()
.and()
.logout()
.logoutSuccessUrl(LOGIN_URL)
.permitAll();
}
}
Вот руководство с примерами: https://www.baeldung.com/spring-security-authentication-and-registration
Спасибо, братан, я попробовал, но это не сработало. Работает только
permitAll().authenticated()иhasAnyAuthority()нет. Я не знаю, нужно ли мне что-то менять в конфигурации swagger, чтобы это работало.