身份认证 - 2

之前我们的用户名密码配置在配置文件中的,而且密码也用的是明文,这明显不符合我们的要求,我们的用户必须是存储在数据库中,密码也是得经过加密的。所以我们先来解决这个问题,然后再去弄授权。

首先来插入一条用户数据,但这里有个问题,就是我们的密码怎么生成?密码怎么来的?这里我们使用Security内置了的BCryptPasswordEncoder,里面就有生成和匹配密码是否正确的方法,也就是加密和验证策略。因此我们再SecurityConfig中进行配置:

@Bean
BCryptPasswordEncoder bCryptPasswordEncoder() {return new BCryptPasswordEncoder();
}

这样系统就会使用我们找个新的密码策略进行匹配密码是否正常了。之前我们配置文件配置的用户名密码去掉:

  • application.yml
#  security:
#    user:
#      name: user
#      password: 111111

ok,我们先使用BCryptPasswordEncoder给我们生成一个密码,给数据库添加一条数据先,我们再TestController中注入BCryptPasswordEncoder,然后使用encode进行密码加密,对了,记得在SecurityConfig中吧/test/**添加白名单哈,不然访问会提示你登录!!

@Autowired
BCryptPasswordEncoder bCryptPasswordEncoder;
@GetMapping("/test/pass")
public Result passEncode() {// 密码加密String pass = bCryptPasswordEncoder.encode("111111");// 密码验证boolean matches = bCryptPasswordEncoder.matches("111111", pass);return Result.succ(MapUtil.builder().put("pass", pass).put("marches", matches).build());
}

可以看到我密码是111111,加密以及验证的结果如下:$2a$10$R7zegeWzOXPw871CmNuJ6upC0v8D373GuLuTw8jn6NET4BkPRZfgK

data中的那一串字符串就是我们的密码了,可以看到marches也是true,说明密码验证也是正确的,我们添加到我们数据库sys_user表中:

INSERT INTO `vueadmin`.`sys_user` (`id`, `username`, `password`, `avatar`, `email`, `city`, `created`, `updated`, `last_login`, `statu`) VALUES ('1', 'admin', '$2a$10$R7zegeWzOXPw871CmNuJ6upC0v8D373GuLuTw8jn6NET4BkPRZfgK', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', '123@qq.com', '广州', '2021-01-12 22:13:53', '2021-01-16 16:57:32', '2020-12-30 08:38:37', '1');

后面我们就可以使用admin/111111登录我们的系统哈。
但是先我们登录过程系统不是从我们数据库中获取数据的,因此,我们需要重新定义这个查用户数据的过程,我们需要重写UserDetailsService接口。

@Slf4j
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@AutowiredSysUserService sysUserService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SysUser sysUser = sysUserService.getByUsername(username);if (sysUser == null) {throw new UsernameNotFoundException("用户名或密码不正确!");}return new AccountUser(sysUser.getId(), sysUser.getUsername(), sysUser.getPassword(), new TreeSet<>());}
}

因为security在认证用户身份的时候会调用UserDetailsService.loadUserByUsername()方法,因此我们重写了之后security就可以根据我们的流程去查库获取用户了。然后我们把UserDetailsServiceImpl配置到SecurityConfig中:

@Autowired
UserDetailsServiceImpl userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService);
}

然后上面UserDetailsService.loadUserByUsername()默认返回的UserDetails,我们自定义了AccountUser去重写了UserDetails,这也是为了后面我们可能会调整用户的一些数据等。

public class AccountUser implements UserDetails {private Long userId;private String password;private final String username;private final Collection<? extends GrantedAuthority> authorities;private final boolean accountNonExpired;private final boolean accountNonLocked;private final boolean credentialsNonExpired;private final boolean enabled;public AccountUser(Long userId, String username, String password, Collection<? extends GrantedAuthority> authorities) {this(userId, username, password, true, true, true, true, authorities);}public AccountUser(Long userId, String username, String password, boolean enabled,boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked,Collection<? extends GrantedAuthority> authorities) {Assert.isTrue(username != null && !"".equals(username) && password != null, "Cannot pass null or empty values to constructor");this.userId = userId;this.username = username;this.password = password;this.enabled = enabled;this.accountNonExpired = accountNonExpired;this.credentialsNonExpired = credentialsNonExpired;this.accountNonLocked = accountNonLocked;this.authorities = authorities;}public Long getUserId() {return userId;}...
}

其实数据基本没变,我就添加多了一个用户的id而已。
ok,万事俱备,我们再次尝试去登录,看能不能登录成功。

1、获取验证码:

2、从控制台获取到对应的验证码

3、提交登录表单

4、登录成功,并在请求头中获取到了Authorization,也就是JWT。完美!!

解决用户登录查库问题相关推荐

  1. Sql Server 解决“用户登录失败,错误编18456”

    Sql Server 解决"用户登录失败,错误编号18456" 1.说明 2.其他错误信息 排错分析 1.说明 因密码或用户名错误而使身份验证失败并导致连接尝试被拒时,类似以下内容 ...

  2. 解决用户登录、注册传输中账号密码的安全泄露问题

    方案是:HASH + Salt HASH + Salt 的操作也称为两次 HASH,其原理是:第一次 HASH 操作进行身份的初次鉴权,网站会返回一个随机数(Salt,盐值),客户端通过服务器返回的随 ...

  3. SqlServer sa 用户登录失败的解决方法

    SqlServer sa 用户登录失败的解决方法 参考文章: (1)SqlServer sa 用户登录失败的解决方法 (2)https://www.cnblogs.com/mobilecard/p/7 ...

  4. linux关闭本地登录密码登录密码错误,vsftpd本地用户登录密码错误的解决方法

    今天发现自己虚拟机的vsftp使用本地用户名无法登陆,于是重新配置,但配置了很多次都没成功,一直显示 530 login incorrect. login failed 解决方式是将vsftp.con ...

  5. linux用户ftp失败,vsftpd本地用户登录密码错误的解决方法

    今天发现自己虚拟机的vsftp使用本地用户名无法登陆,于是重新配置,但配置了很多次都没成功,一直显示 530 Login incorrect. Login failed 解决方式是将vsftp.con ...

  6. 解决root用户登录Ubuntu12.04 LTS图形界面

    解决root用户登录Ubuntu12.04 LTS图形界面 刚更新完Ubuntu12.04LTS想尝尝鲜啊--结果杯了个具的--新版本的lightdm登录选项里没有其它用户的选项了,直接导致无法使用r ...

  7. 局域共享解决——用户账户限制,可能的原因包括不允许空密码,登录时间限制...

    http://blog.163.com/lenovo_gxr/blog/static/5527719720145583144126/ 在客户端访问共享遇到的错误之八: 错误提示框为如图:用户账户限制, ...

  8. 解决 用户'sa'登录失败。错误:18456 问题

    问题描述:用户'sa'登录失败.错误:18456 产生原因:由于服务器身份验证模式为'Windows 身份验证模式',所以导致登录失败 解决方案:   1.使用'Windows 身份验证模式'登录服务 ...

  9. 银河麒麟V10-桌面版 用户登录密码遗忘解决过程

    银河麒麟V10-桌面版 用户登录密码遗忘解决过程 系统版本: 银河麒麟V10-桌面版,内核:Linux-4.4.131 解决办法: 重启系统,进单用户模式进行修改. 解决步骤: 第一步:重启操作系统, ...

最新文章

  1. 题目1203:IP地址
  2. HTML5 Canvas、内联 SVG、Canvas vs. SVG
  3. 十二年 10 次 IT 大考 猪八戒网的系统架构和开发流程经历了什么?
  4. hdu 6034 B - Balala Power! 贪心
  5. tip for interview
  6. php封装一个加密算法,PHP封装的非对称加密RSA算法示例
  7. python创建不可变集合_python不可变集合是什么
  8. 防止汽轮机严重超速的技术措施 22437
  9. Message from debugger: Terminated due to signal 6
  10. 微积分-指数函数求导
  11. 游戏辅助原理与制作02-植物大战僵尸03-冷却时间基址
  12. html5标题标语,弘扬传统文化宣传标语
  13. 虚拟机下的SYN Flood测试
  14. linux下网速监控 linux及android分网卡网速监控
  15. PreScan 教程:0. PreScan与Matlab连接
  16. Asciinema - 终端日志记录神器,机器学习开发者的福音
  17. 阿里淘系优质开源项目推荐(下)
  18. Invalid header signature; read 0x3C0A0D0A0DBFBBEF, expected 0xE11AB1A1E011CFD0
  19. 高通Camera驱动(2)-- openinitialize
  20. 得力计算机怎么把小数化成分数,判断分数能否化成有限小数的方法.ppt

热门文章

  1. 美观实用的标签切换菜单
  2. 【opencv】VideoCapture打不开本地视频文件或者网络IP摄像头
  3. Oracle11gR2-聚簇因子浅析
  4. Spring注解方式实现定时器
  5. Android 文件的存储和加载
  6. Query 快速入门教程
  7. 省常中模拟 Test4
  8. java 初始化的加载顺序问题
  9. new,is和as运算符解析及运行时类型,对象,线程堆栈,托管堆之间的联系
  10. php面试专题---2、常量及数据类型考点