文章目录
第二节:SpringSecurity(二):SpringSecurity入门
第三节:Spring Security(三):Security中重要的几个类
第四节:Spring Security(四):Security的第一次资源访问流程
第五节:Spring Security(五):Security登陆的超简单例子
第六节:Spring Security(六):Security登录的用户名和密码的校验逻辑
在弄明白第一次资源访问流程后,我准备尝试去写一个登陆流程,关于登陆流程这块比较简单,所以我想写一个能够快速上手的小示例。
前言
登陆流程核心类是UserDetailsService接口,所以根据登录流程,我从UserDetailsService入口来自定义登录流程。
一、登录流程
1. 根据用户名查找用户
Spring Security会根据UserDetailsService的loadUserByUsername方法,根据传递的参数username获取用户信息。
2.校验密码的合法性
Spring Security会将传过来的密码和查询到的用户信息中的密码放到一个密码器中进行校验,校验成功则登录成功,否则登录失败。
二、使用步骤
1.创建UserDetailsService实现类
@Service
public class UserServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (!"user".equals(username)){
throw new UsernameNotFoundException("用户名不存在");
}
String password = new BCryptPasswordEncoder().encode("user");
return new User(username, password, AuthorityUtils.createAuthorityList());
}
}
2.构建User对象
构建User对象,如上图,需要三个参数,Username, password和权限,权限我们使用AuthorityUtils来进行创建。
3.PasswordEncoder的作用
Spring Security在使用密码器的时候,是在Spring的IOC容器里面获取的,上面的代码明显是new出来的密码器对象,所以在进行登录操作时,后台会报错。
4.解决办法
将PasswordEncoder对象放到容器中
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder getPasswordEncoder(){
return new BCryptPasswordEncoder();
}
}
修改UserDetailsService实现类
@Service
public class UserServiceImpl implements UserDetailsService {
@Autowired
PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (!"user".equals(username)){
throw new UsernameNotFoundException("用户名不存在");
}
String password = passwordEncoder.encode("user");
return new User(username, password, AuthorityUtils.createAuthorityList());
}
}
总结
本次学习,主要掌握Spring Security的登录编程逻辑。
1. 需要掌握UserDetailsService类的用处
2. 需要掌握PasswordEncoder类的用法(这个可以去看下源码)
3. 需要将PasswordEncoder类交给Spring容器来管理