UserDetails和UserDetailsService的理解与使用——将数据库中的数据作为登录账号和密码

添加依赖:Spring Boot Starter Security

我们在进行操作之前必须要先登录

这时无论访问那个地址,都会自动跳转到login地址

在idea控制台中会有登录的密码,由 Spring Security定义生成的。

如何将数据库中的数据作为登录账号和密码?

当什么也没有配置的时候,账号和密码是由 Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。如果需要自定义逻辑时,只需要实现 UserDetailsService 接口即可。

  1. UserDetailsService中可以读取登录填写的String变量,就是我们输入的用户名。
  2. 利用QueryWrapperUserMapper判断数据库中是否有该username
  3. 如果有的话返回一个新的User,将这个新的User传递给UserDetailsUserDetails可以通过User新建一个登录的用户

UserDetails和UserDetailsService是什么?

两个接口

UserDetails:提供用户核心信息,登录之后,根据登录的用户名和密码,查询到的对应用户信息和权限信息。

UserDetailsService:自定义用户的登录逻辑。

下面是代码实现——通过数据库中每个user的username和password进行登录

@Service 
//千万不能忘了Service
//@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中,不需要再在applicationContext.xml文件定义bean了。
//自动扫描路径下面的包的时候,如果一个类带了@Service注解,将自动注入到Spring容器类似的还包括@Component、@Repository、@Controller。
//用人话说就是加了@Service后spring就会运行该类中的代码
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //username就是在网址中填入的用户名
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username); //查找相同的用户名是否存在
        User user = userMapper.selectOne(queryWrapper);
        if (user == null) {
            throw new RuntimeException("用户不存在");
        }
        return new UserDetailsImpl(user); //给UserDetails一个User,创建一个新的登录用户
    }
}
//不要忘记构造函数和set、get之类的,可以用lombok包快速实现
@Data
@NoArgsConstructor
@AllArgsConstructor
//创建了一个以User的username和password为用户名和密码的账户,这样我们就可以直接登录啦
public class UserDetailsImpl implements UserDetails {
    User user;
    //获取所有权限
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }
    //获取密码
    @Override
    public String getPassword() {
        return user.getPassword();
    }
    //获取用户名
    @Override
    public String getUsername() {
        return user.getUsername();
    }
    //账户是否过期
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
    //账户是否被锁
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
    //凭证是否过期 密码是否过期
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
    //账户是否可用
    @Override
    public boolean isEnabled() {
        return true;
    }
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XSS9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值