目录
一、内存认证
@Configuration public class SecurityConfig { //定义认证逻辑 @Bean public UserDetailsService userDetailsService(){ //使用内存数据进行认证 InMemoryUserDetailsManager manager=new InMemoryUserDetailsManager(); //创建两个用户 UserDetails u1= User.withUsername("root").password("1234").authorities("admin").build(); UserDetails u2=User.withUsername("gq").password("2222").authorities("admin").build(); //将这两个用户添加到内存中 manager.createUser(u1); manager.createUser(u2); return manager; } //密码编译器,不解析密码,也就是不加密 @Bean public PasswordEncoder passwordEncoder(){ return NoOpPasswordEncoder.getInstance(); } }
二、认证逻辑
在实际项目中,认证逻辑是需要自定义控制的。将
UserDetailsService
接口的实现类放入Spring容器即可自定义认证逻辑。InMemoryUserDetailsManager
就是UserDetailsService
接口的一个实现类,它将登录页传来的用户名密码和内存中用户名密码做匹配认证。当然我们也可以自定义UserDetailsService
接口的实现类。
UserDetailsService
的实现类必须重写loadUserByUsername
方法,该方法定义了具体的认证逻辑,参数username
是前端传来的用户名,我们需要根据传来的用户名查询到该用户(一般是从数据库查询),并将查询到的用户封装成一个UserDetails对象,该对象是Spring Security提供的用户对象,包含用户名、密码、权限。Spring Security会根据UserDetails对象中的密码和客户端提供密码进行比较。相同则认证通过,不相同则认证失败。
三、数据库认证(也就是用户名和密码在数据库中寻找)
(1)mapper层
public interface UserMapper extends BaseMapper<users> { }
(2)启动类添加扫描注解
@SpringBootApplication @MapperScan("com.gq.springsecurity.mapper") public class SpringsecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringsecurityApplication.class, args); } }
(3)编写UserDetailsService实现类
@Service public class UserMapperService implements UserDetailsService { @Autowired private UserMapper userMapper; //自定义认证逻辑 @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //构造查询条件 QueryWrapper<users> wrapper=new QueryWrapper<users>().eq("username",username); //查询用户 users users=userMapper.selectOne(wrapper); //封装为UserDetails对象 UserDetails userDetails= User.withUsername(users.getUsername()).password(users.getPassword()).authorities("admin").build(); //返回封装好的UserDeatails对象 return userDetails; } }