SpringSecurity
在狂神的教程中没有对SpringSecurity如何从数据库中取数据讲解所以通过百度进一步学习,并记录一下
一、使用步骤
- SpringSecurity中需要把pojo类继承 UserDetails接口,并重写它的方法
例如:
public class UserLogin implements UserDetails {
int id;
String username;
String password;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
这里需要注意的,SpringSecurity默认使用username和password字段(小写),如果你取名不同还需要重写这俩个方法
例如:passWord的这样一个字段命名则将你的字段返回
这样SpringSecurity就可以获取到username和password。
02. 然后service层需要写一个继承UserDetailsService的实现类,实现以下方法
@Autowired
private Login login; //数据库中的Mapper
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserLogin login = this.login.login(username); //从数据库取值,然后将值赋给pojo类
if (login.getUsername() != null){
return login;
}
throw new UsernameNotFoundException("User"+username+"mot found");
}
在该方法在SpringSecurity中的DaoAuthenticationProvider类retrieveUser中
源码:
这里返回了一个loadedUser即数据库中查找到的数据,该方法又被AbstractUserDetailsAuthenticationProvider抽象类中的authenticat(认证)方法调用
如图:
可以看见该方法有俩个参数,第一个参数就是前端输入的用户名,然后调用retrieveUser方法通过前端输入的用户名查找出数据库中数据,并赋值给user。这个user在密码匹配和验证账户状态时使用到
如下图:
第一个方法用于查看账户状态,就不看源码了,主要是第二个方法,用于进行密码匹配。
该方法调用的是DaoAuthenticationProvider类的additionalAuthenticationChecks方法
俩个参数
- 第一个为数据库内查出的数据包含用户名和密码,该密码使用了加密所以需要进行密码匹配。
- 第二个参数为前端输入的账户、密码被封装为了UsernamePasswordAuthenticationToken类的对象
源码如图:
在源码中的密码匹配在
if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword()))
这里调用你加密方式的密码匹配方法。
03. SpringSecurity配置类只需要写上
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsServicelmpl).passwordEncoder(passwordEncoder());
}
二、完结
至此,SpringSecurity的如何从数据库中取值,如何进行密码匹配就完结了。