SpringSecurity从数据库中读取数据并完成密码匹配

SpringSecurity

在狂神的教程中没有对SpringSecurity如何从数据库中取数据讲解所以通过百度进一步学习,并记录一下

一、使用步骤

  1. 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中的DaoAuthenticationProviderretrieveUser
源码:
这里返回了一个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的如何从数据库中取值,如何进行密码匹配就完结了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值