我需要一个登录策略来处理mysql数据库。我的用户表有md5密码加密。 我需要开发登录。我的代码不起作用。这是我的SecutiryConfig:
@Configuration
@EnableWebSecurity
@EnableGlobalAuthentication
@ComponentScan("org.ebook.*")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
Environment env;
@Autowired
private UserRepository userRepository;
@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(new UserService(userRepository)).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/").hasAnyRole("USER", "ADMIN").antMatchers("/index")
.hasAnyRole("USER", "ADMIN").antMatchers("/dashboard").hasAnyRole("USER", "ADMIN")
.antMatchers("/login").hasRole("ANONYMOUS").and().formLogin().loginPage("/login")
.defaultSuccessUrl("/dashboard").usernameParameter("username")
.passwordParameter("password").and().rememberMe()
.tokenValiditySeconds(Integer.parseInt(env.getProperty("session.tokenValidity")))
.key(env.getProperty("session.key")).and().logout().logoutSuccessUrl("/login").and()
.exceptionHandling().accessDeniedPage("/403").and().csrf();
}
@Bean
public Md5PasswordEncoder passwordEncoder(){
Md5PasswordEncoder encoder = new Md5PasswordEncoder();
return encoder;
}
}
并且是我的UserService:
@Service
@Transactional(readOnly = true)
public class UserService implements UserDetailsService {
private UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
org.fingerlinks.ebook.model.bean.User user = null;
if (userRepository!=null) {
user = userRepository.findByUsername(username);
}
if (user != null) {
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
return new User(user.getUsername(), user.getPassword(), authorities);
}
throw new UsernameNotFoundException("User '" + username + "' not found");
}
}
我的问题是,如果我在用户表上使用带有加密密码的passwordEncoder,则登录页面中的用户无法登录。 但是如果我在java代码和用户表中删除编码,那么一切都运行良好。 任何人都可以帮我理解可怕的错误在哪里吗?
我正在使用spring 4.1.6和spring security 4.0.2。
答案 0 :(得分:1)
保存用户密码时尝试此操作:
Md5PasswordEncoder encoder = new Md5PasswordEncoder();
user.setPassword(encoder.encode(user.getPassword()));
答案 1 :(得分:0)
Spring安全性对输入的密码进行编码并检查数据库密码。
在您的情况下,您将在数据库中存储普通密码而不是编码密码。使用Md5PasswordEncoder
对密码进行编码并将其存储在数据库中。