Я новичок в безопасности 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);
}
}
Любая помощь и совет будут срочными.