springsecurity用户验证,默认我们为了简单,直接使用在配置文件中写死用户名和密码的方式:
在真实的系统中,我们希望用户的信息来自数据库,而不是写死的,我们就需要实现UserDetailsService接口,实现相应的方法,然后配置authentication-provider,指定我们自定义的UserDetailService。
这里定义一个类SecurityUserDetailsService,实现UserDetailsService接口:
package com.xxx.ssh.web.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import com.xxx.ssh.web.domain.User;
import com.xxx.ssh.web.service.UserService;
public class SecurityUserDetailsService implements UserDetailsService {
@Autowired
private UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userService.findByUsername(username);
if(user==null) {
throw new UsernameNotFoundException("用户名或密码错误");
}
return new org.springframework.security.core.userdetails.User(username,
user.getPassword(),
user.isStatus(),
true,
true,
true,
getGrantedAuthority(user));
}
public List getGrantedAuthority(User user){
List list = new ArrayList<>();
list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return list;
}
}
另外,就需要配置一下authentication-provider即可,在配置之前,我们需要将SecurityUserDetailsService这个实体bean配置好。修改后的spring-security配置。
数据库中的密码使用了md5加密,所以这里配置authentication-provider属性的时候,我们需要配置password-encoder,指定hash="md5",这样在登录验证的时候,我们前端传过来的密码会经过md5加密,然后和数据库中的密码做比对,如果用户名密码都正确,登录成功,否则,登录失败。