К методу в контроллере должен иметь доступ только юзер с ролью администратор, проблема в том, что он этот доступ получить не может. Сначала все работает хорошо, при попытке доступа, идет редирект на форму логина, но затем после успешной аутентификации, при повторной попытке доступа к защищенному адресу выскакивает 403 ошибка. Не могу понять в чем проблема, все вроде правильно, у юзера правильные роли, достаются из базы правильно. Ниже код конфигурации секьюрити, сервис авторизации и контроллер
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService securityService;
@Autowired
AuthenticationSuccessHandler authenticationSuccessHandler;
@Autowired
AuthenticationFailureHandler authenticationFailureHandler;
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(securityService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// .antMatchers("/driver/**").access("hasRole('ROLE_ADMIN')")
.and()
.formLogin()
.permitAll()
.loginProcessingUrl("/login")
.usernameParameter("username")
.passwordParameter("password")
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.and()
.logout()
.permitAll()
.logoutUrl("/logout");
}
}
@Service
@Transactional
public class SecurityService implements UserDetailsService {
@Autowired
UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserEntity userEntity = userRepository.findByUsername(username);
List<GrantedAuthority> authorities
= buildUserAuthority(userEntity.getRole());
return buildUserForAuthentication(userEntity, authorities);
}
private List<GrantedAuthority> buildUserAuthority(RoleEntity roleEntity) {
Set<GrantedAuthority> setAuths = new HashSet<>();
setAuths.add(new SimpleGrantedAuthority(roleEntity.getName()));
List<GrantedAuthority> Result = new ArrayList<>(setAuths);
return Result;
}
private User buildUserForAuthentication(UserEntity userEntity,
List<GrantedAuthority> authorities) {
return new User(userEntity.getUsername(), userEntity.getPasswordHash(),
userEntity.getEnabled(), true, true, true, authorities);
}
}
@RestController
@Secured({"ROLE_ADMIN"})
@RequestMapping(value = "/driver")
public class DriverController {
@Autowired
DriverService driverService;
@Autowired
AdminService adminService;
@Secured("ROLE_ADMIN")
@GetMapping()
@JsonView(DriverDTO.Main.class)
public List<DriverDTO> getDriversByCompanyAsking() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
CompanyDTO companyDTO = adminService.getCompanyByAdminUsername(auth.getName());
return driverService.getDriversByCompany(companyDTO);
}
}