最简单的Shiro免密登陆(springboot)

待我称王封你为后i 2023-05-21 12:57 122阅读 0赞

思路比较简单,实现也简单,要的就是简单! 实际项目中可以此基础上封装

重写UsernamePasswordToken 中 getCredentials() 方法。所以新增了类NoPwdToken

UserRealm类中的 doGetAuthenticationInfo(AuthenticationToken authcToken) 方法执行时,判断参数authcToken的类型如果是NoPwdToken类型,则返回值改为getCredentials()方法对应的验证信息。(即:SimpleHash simpleHash = new SimpleHash(“SHA-256”, “123456”, null, 16);)。

1、增加类:NoPwdToken (关键地方是20行重写的方法)

  1. import org.apache.shiro.authc.UsernamePasswordToken;
  2. public class NoPwdToken extends UsernamePasswordToken {
  3. public NoPwdToken(String username) {
  4. this.username = username;
  5. }
  6. private String username;
  7. public String getUsername() {
  8. return username;
  9. }
  10. public void setUsername(String username) {
  11. this.username = username;
  12. }
  13. @Override
  14. public Object getCredentials() {
  15. //这里和下方的123456对应,也可以别的,一致即可。
  16. return "123456";
  17. }
  18. }

2、修改UserRealm类中 的 doGetAuthenticationInfo(AuthenticationToken authcToken) 方法。(关键地方是2-13行)

  1. // 判断是否免密登陆类型
  2. if (authcToken instanceof NoPwdToken) {
  3. // 免密登陆
  4. NoPwdToken token = (NoPwdToken) authcToken;
  5. SysUserEntity user = sysUserDao.selectByUserName(token.getUsername());
  6. if (user != null) {
  7. //这里和上面的123456对应,也可以别的,一致即可。
  8. SimpleHash simpleHash = new SimpleHash("SHA-256", "123456", null, 16);
  9. return new SimpleAuthenticationInfo(user, simpleHash, this.getClass().getSimpleName());
  10. } else {
  11. return null;
  12. }
  13. } else {
  14. // 默认的登陆方式
  15. UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
  16. user.setUsername(token.getUsername());
  17. }

测试:

  1. /**
  2. * 免密登陆
  3. */
  4. @SysLog("免密登陆")
  5. @ResponseBody
  6. @RequestMapping(value = "/sys/nopwdlogin")
  7. public R nopwdlogin(@RequestParam Map<String, String> params, HttpServletRequest req, HttpServletResponse res) {
  8. String username = params.get("username");
  9. try {
  10. if (StringUtil.isBlank(username)) {
  11. return R.error("用户名不能为空");
  12. }
  13. Subject subject = SecurityUtils.getSubject();
  14. if (null != subject.getPrincipal()) {
  15. // 已经登陆过的情况
  16. res.sendRedirect("http://localhost/web/index.html");
  17. return R.ok().put("user", ShiroUtils.getUserEntity());
  18. }
  19. // 使用自定义Token
  20. NoPwdToken ssoToken = new NoPwdToken(username);
  21. subject.login(ssoToken);
  22. } catch (UnknownAccountException e) {
  23. return R.error(e.getMessage());
  24. } catch (IncorrectCredentialsException e) {
  25. return R.error("账号或密码不正确");
  26. } catch (LockedAccountException e) {
  27. return R.error("账号已被锁定,请联系管理员");
  28. } catch (AuthenticationException e) {
  29. return R.error("账户验证失败");
  30. } catch (Exception e) {
  31. return R.error("未知异常");
  32. }
  33. SysUserEntity sysUser = ShiroUtils.getUserEntity();
  34. sysUser.setPassword(null);
  35. try {
  36. res.sendRedirect("http://localhost/web/index.html");
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. return R.ok().put("user", sysUser);
  41. }

发送请求:http://localhost:9000/sys/nopwdlogin?username=yuer

其他问题:

1、如果加密类型和上方不同,可以参考 org.apache.shiro.authc.credential.HashedCredentialsMatcher 中 hashProvidedCredentials 方法。断点打在这里就可以看到了,如图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NodzA2Mjk_size_16_color_FFFFFF_t_70

2、用户输入密码和实际密码比较方法具体位置在 org.apache.shiro.authc.credential.HashedCredentialsMatcher 中 doCredentialsMatch 方法。如下图:

20200419041523455.png

发表评论

表情:
评论列表 (有 0 条评论,122人围观)

还没有评论,来说两句吧...

相关阅读

    相关 登陆简介版

    SSH 三步解决免密登录 1.客户端生成公私钥 2.上传公钥到服务器 3.测试免密登录 1.客户端生成公私钥 本地客户端生成公私钥: ssh-ke

    相关 ssh登陆脚本

    运行脚本前面需要先配置好/etc/hosts文件的ip映射,这个脚本是根据hosts文件的ip进行免密登陆配置的 密码可以自己修改PWD\_1 运行需要联网需要联网