У меня есть этот класс SpringSecurityWebAppConfig
в этом проекте Demo
.
Я создал библиотеку для повторного использования моей аутентификации и авторизации. Отсюда мой JwtAuthenticationFilter
.
В моей библиотеке мой модульный тест для класса фильтра уже завершен. Так что, в моем Demo
проекте, я все еще должен передать токен доступа? или я могу пропустить фильтр?
@Configuration
@EnableWebSecurity
public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter {
@Autowired
public JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(new CustomAuthenticationEntryPoint())
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterAfter(jwtAuthenticationFilter, BasicAuthenticationFilter.class)
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/v1/library/**").access("hasRole('ROLE_READER')")
.and()
.headers()
.httpStrictTransportSecurity()
.includeSubDomains(true).maxAgeInSeconds(31536000);
}
}
JwtAuthenticationFilter
в классе библиотеки:
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private AuthenticationService authenticationService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
getJwtFromRequest(request, response, filterChain);
}
private void getJwtFromRequest(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String ipAddress = NetworkUtil.getClientIp(request);
String requestUrl = request.getRequestURL().toString();
String bearerToken = request.getHeader("Authorization");
// Step 1: Check if bearer token exist in authorization header and if bearer token start with "Bearer "
if (!StringUtils.hasText(bearerToken) || !bearerToken.startsWith("Bearer ")) {
String errorMsg = "No access token found in request headers.";
throw new AccessTokenMissingException(errorMsg);
}
// ... do other stuff here
}
}
Контрольный пример:
@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(LibraryController.class)
public class LibraryControllerTest {
@Autowired
private WebApplicationContext context;
@Autowired private MockMvc mockMvc;
@MockBean private LibraryProfileService libraryProfileService;
@Autowired
private Filter springSecurityFilterChain;
private ObjectMapper objectMapper;
@Before
public void setup() {
objectMapper = new ObjectMapper();
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.addFilters(springSecurityFilterChain)
.build();
}
@Test
@WithMockUser(roles={"READER"})
public void Given_Library_When_Called_Then_ReturnData() throws Exception {
final ResultActions resultActions =
mockMvc
.perform(get("/v1/library")
.andExpect(status().isOk());
final String contentAsString = resultActions.andReturn().getResponse().getContentAsString();
final LibraryDto result =
objectMapper.readValue(contentAsString, LibraryDto.class);
assertNotNull(result);
assertEquals(2, result.getTotal().getTotalElements());
}
}
Журнал ошибок при выполнении теста:
com.appl.security.common.exception.AccessTokenMissingException: No access token found in request headers.
at com.appl.security.common.filter.JwtAuthenticationFilter.getJwtFromRequest(JwtAuthenticationFilter.java:93)