1.自定义用户名
/**
* 流程:
* 1.客户端发送post请求,认证(登录)
* 2.客户端携带请求参数:用户名(username)和密码(password)
* 3.Security直接调用UserDetailsService.loadUserByUsername方法,查询用户。(要求spring容器中必须有此接口的实现对象)
* 4.如果loadUserByUsername方法抛出异常,则直接提示客户端,用户名或密码错误。
* 5.如果loadUserByUsername方法返回UserDetails类型的对象,则进入密码校验流程。
* 6.先使用PasswordEncoder加密请求发送来的密码,再校验请求参数密码和UserDetails中包含的密码是否一致。(要求spring容器必须有PasswordEncoder对象)
* 7.如果密码校验失败,直接提示客户端,用户名或密码错误
* 8.如果密码校验成功,进入认证成功后的视图
*/
@Component
public class UserLoginDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserService userService;
public UserLoginDetailsServiceImpl(){
System.out.println("自定义接口实现类型对象已创建");
}
/**
* 认证方法
* @param username
* @return
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
System.out.println("loadUserByUsername("+username+")方法开始执行");
//查询用户
User user = userService.loginUser(username, null);
System.out.println("查询的用户是:"+user);
//判断用户是否存在,不存在抛出异常
if (user==null){
throw new UsernameNotFoundException(username+"用户不存在");
}
//返回security内置的user对象
return new org.springframework.security.