Задать вопрос
@mirus36

Почему не работает мои настройки SPRING SECURITY?

К методу в контроллере должен иметь доступ только юзер с ролью администратор, проблема в том, что он этот доступ получить не может. Сначала все работает хорошо, при попытке доступа, идет редирект на форму логина, но затем после успешной аутентификации, при повторной попытке доступа к защищенному адресу выскакивает 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);
    }

}
  • Вопрос задан
  • 822 просмотра
Подписаться 1 Оценить 4 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы