весенняя загрузка AuthenticationManager каждый раз возвращает 403 - PullRequest
0 голосов
/ 26 февраля 2019

Я новичок в безопасности Spring и пытаюсь внедрить базовую аутентификацию в сервисе остальной загрузки. Я использую аутентификацию на основе базы данных и имею таблицу User и Role. Когда я делаю запрос любого контроллера в моем приложении с правильными учетными данными, он дает мневсегда запрещен 403. Я не могу понять, почему. Я проверяю роль много раз, это правильно. И в именах ролей базы данных "USER" и "RESTAURANT" и "ADMIN". Я пробовал оба с префиксом ROLE_ и автономным синтаксисом верхнего регистра либопуть не сработал. Не знаю, что я делаю не так. Вот мой класс конфигурации:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled=true,jsr250Enabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    private UserDetailsService customUserDetailsService;

    @Autowired
    private AuthenticationEntryPoint authEntryPoint;

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception
    {
        auth.userDetailsService(customUserDetailsService)
        .passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .httpBasic()
            .authenticationEntryPoint(authEntryPoint)
            .and()
            .authorizeRequests()
            .antMatchers("/user/register","/forgotPassword").permitAll()
            .anyRequest().authenticated()
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
             ;
    }
    }

Вот моя реализация UserDetailService:

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
        User user = userRepository.findByUsername(username);
        System.out.println(user.toString()); //here i check if it's finding right user 
        if (user == null) {
            throw  new UsernameNotFoundException(username +" not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user));
    }

    private static Collection<? extends GrantedAuthority> getAuthorities(User user)
    {
        String[] userRoles = user.getRoles()
                                    .stream()
                                    .map((role) -> role.getName())
                                    .toArray(String[]::new);
        Collection<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(userRoles);
        return authorities;
    }
}

И этоодин из моих контроллеров, который возвращает 403:

@PreAuthorize("hasRole('USER')")
    //@Secured("USER")
    @GetMapping("/{restaurantmenu}") //bütün menüyü çeker
    Collection<Menu> getMenu(@PathVariable("restaurantmenu") Long id) {
        return menuService.getMenuItemsByRestaurant(restaurantService.getRestaurant(id));
    }

И для вашей информации.У меня есть URL-адрес регистрации, поэтому я беру нового пользователя через json и регистрирую его в базе данных с зашифрованным (Bcrypt) паролем, и я пытаюсь аутентифицироваться с этим. Я могу найти нового пользователя и зарегистрироваться в БД и правильно зашифровать пароль.Я не знаю, смогу ли я контролировать имя пользователя и электронную почту при регистрации таким способом, но если вам не безразличен вот ответный метод контроллера:

@RestController
@RequestMapping(value="/user")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/register")
    void registerUser(@Valid @RequestBody User user) {
        userService.save(user);
    }
}

Любая помощь и совет будут срочными.

1 Ответ

0 голосов
/ 26 февраля 2019

Сохранение ролей как ROLE_USER, ROLE_ADMIN в базе данных и добавление определенного метода может помочь вам.

.antMatchers(HttpMethod.POST,"/user/register","/forgotPassword").permitAll()
.antMatchers(HttpMethod.GET,"/restaurantURL").permitAll()

РЕДАКТИРОВАТЬ: См. Это, чтобы получить более подробную информацию о ролях

...