У меня проблема с аутентификацией jdbc в приложении, использующем Spring Security.Иногда я могу войти без каких-либо сложностей (передавая правильные учетные данные), но иногда приложение отображает «неверные учетные данные» на странице входа в систему (я уверен, что учетные данные правильные).
Я использую Spring BootSpring Security, MySQL, BCryptEncoder для хранения паролей пытались внести множество изменений, но результат все тот же ...
Код аутентификации JDBC:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery("SELECT username, password, 'true' as enabled"
+ " FROM user WHERE username=?")
.authoritiesByUsernameQuery("SELECT username, authority"
+ " FROM authorities WHERE username=?")
.passwordEncoder(new BCryptPasswordEncoder());
}
Конфигурация безопасности Spring:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login")
.permitAll()
.antMatchers("/registration")
.permitAll()
.antMatchers("/forgot-password", "/reset**")
.permitAll()
.antMatchers("/**")
.access("hasRole('ROLE_USER')")
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.usernameParameter("username")
.passwordParameter("password")
.and()
.rememberMe()
.rememberMeCookieName("home-budget-login-cookie")
.tokenValiditySeconds(365 * 24 * 60 * 60)
.rememberMeParameter("remember-me")
.tokenRepository(persistentTokenRepository())
.and()
.logout()
.permitAll()
.deleteCookies("auth_code", "home-budget-login-cookie");
}
Сохранение нового метода пользователя (процесс регистрации):
@Service("userService")
public class UserService {
public void saveUser(User user, boolean updateMode) {
user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
user.setPasswordConfirm(new BCryptPasswordEncoder().encode(user.getPasswordConfirm()));
user.setEnable(1);
User userReturned = userRepository.save(user);
if (!updateMode) {
Authorities role = new Authorities();
role.setUsername(userReturned.getUsername());
role.setAuthority("ROLE_USER");
roleRepository.save(role);
}
}
}
Пользователь:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private int id;
@Column(name = "username")
@NotNull
private String username;
@Column(name = "email")
@Email(message = "Please provide a valid e-mail")
@NotNull
private String email;
@Column(name = "password")
@NotNull
private String password;
@Column(name = "password_confirm")
@NotNull
private String passwordConfirm;
@Column(name = "enabled")
private int enable;
@Column(name = "reset_token")
private String resetToken;
Я ожидаю, что приложение войдет в систему без проблем,во время передачи правильных учетных данных.Есть ли лучший способ, чем аутентификация jdbc?