Security使用笔记(一)
一、项目在pom中导入security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
二、导入依赖后,在访问项目时就会默认跳转到一个security自带的登录页面,这个时候账号是默认的root,密码自动生成,在控制台有打印。

三、我们需要让这个登录是去查数据库进行校验,所以我们就不能用他的默认校验,而默认校验调用的是UserDetailsService接口里面的loadUserByUsername()方法,所以我们重写这个方法,让默认校验改成访问数据库校验。其次这个方法返回的是一个UserDetails 接口对象,所以我们写一个LoginUser类去实现UserDetails 接口,将查出来的user对象里面的用户名密码之类的放入LoginUser返回,这样就初步实现了查询数据库登录校验的操作(别忘了写@Service,不然这个类注入不了容器,就不会执行我们重写的这个方法)
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
UserMapper userMapper;
/**
* 登录时security会调用 loadUserByUsername方法根据用户名查询用户信息
* 把用户信息以及权限信息封装成UserDetails返回
* @param
* @return
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<User>();
qw.eq(User::getUserName,name);
User user = userMapper.selectOne(qw);
if (user == null){
throw new RuntimeException("没有该用户");
}
return new LoginUser(user);
}
}
四、但是这个时候输入数据库里面的用户名密码,发现页面又跳回登录页,并且后端报错了
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null", 这个是因为在登录的时候会默认你是使用加密的密码,然后加密方式会在你密码前面大括号里面,格式大概是:{加密方式}password。所以我们一般不常用默认加密的方式。这个时候我们就要PasswordEncoder 里面的加密方式确认下来,然后放到容器中。一般使用的是BCryptPasswordEncoder加密方式。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
五、写个单元测试,拿一下用BCryptPasswordEncoder产生的加密密码,放入数据库,
再次输入用户名密码登录,发现登进去了。


六、我们的登录时跟数据库信息进行校验了,然后还要一个问题我们平时的登录其实是有自己的界面,获取用户登录信息其实也是要通过自己定义接口去接收。所以我们要重写认证的方法,将我们接口获取到的信息传入认证方法中。认证方法是authenticationManagerBean(),
为了可以我们调用认证方法,我们重写authenticationManagerBean()方法,并且放入容器;


浙公网安备 33010602011771号