Я создал сервис, который может сохранять нового пользователя в базу данных и (должен) аутентифицировать пользователя.Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не могу аутентифицировать моего пользователя с тем же именем пользователя и паролем после того, как я создал его со службой.
Аутентификация: обычная аутентификация
Кодировщик пароля: BCryptPasswordEncoder
База данных: локальнаяMongodb
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PasswordEncoder encoder;
@Autowired
private UserService userService;
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests().antMatchers("/config", "/registerUser").permitAll()
.and()
.authorizeRequests().antMatchers("/**").authenticated().and().httpBasic()
.and().logout().logoutSuccessUrl("/").permitAll()
;
}
@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
//authentication will work if I switch to the in-memory authentication below
// authManagerBuilder
// .inMemoryAuthentication()
// .withUser("user").password(encoder.encode("password")).roles("USER");
authManagerBuilder.authenticationProvider(authProvider());
}
@Bean
public DaoAuthenticationProvider authProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userService);
authProvider.setPasswordEncoder(this.encoder);
return authProvider;
}
}
@Service
public class UserService implements IUserService {
@Autowired
private UserDetailRepository userDetailRepository;
@Autowired
private PasswordEncoder encoder;
@Override
public User saveUser(User user) {
String password = user.getPassword();
String passwordHased = this.encoder.encode(password);
user.setPassword(passwordHased);
User ud = this.userDetailRepository.save(user);
return ud;
}
@Override
public User getUserWithId(String userId) {
return this.userDetailRepository.findById(userId).get();
}
@Override
public User loadUserByUsername(String s) throws UsernameNotFoundException {
return this.userDetailRepository.findByUsername(s);
}
}
public class User implements UserDetails {
@Id
private String userId;
private String username;
private String password;
@Override
public final Collection<? extends GrantedAuthority> getAuthorities() {
List<String> privileges = new ArrayList<>();
privileges.add("READ");
privileges.add("WRITE");
return getGrantedAuthorities(privileges);
}
private final List<GrantedAuthority> getGrantedAuthorities(final List<String> privileges) {
final List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (final String privilege : privileges) {
authorities.add(new SimpleGrantedAuthority(privilege));
}
return authorities;
}
... (other overridden methods omitted)
}
Я подозреваю, что мой метод getAuthorities () работает неправильно.
Пожалуйста, дайте мне знать, если вам нужно больше информации