一、数据库实体类

数据库实体类要包括用户ID、密码、盐值以及账户状态。

username password salt status

二、自定义Realm

/*** Shiro自定义Realm*/
public class MyRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;/*** 授权* @param principalCollection* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}/*** 认证* @param authenticationToken* @return* @throws AuthenticationException** 客户端传来的 username 和 password 会自动封装到 token,先根据 username 进行查询,*      如果返回 null,则表示用户名错误,直接 return null 即可,Shiro 会自动抛出 UnknownAccountException 异常。*      如果返回不为 null,则表示用户名正确,再验证密码,直接返回  SimpleAuthenticationInfo 对象即可,*          如果密码验证成功,Shiro 认证通过,否则返回 IncorrectCredentialsException 异常。*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {//System.out.println("启动认证");UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;//获取存放到数据库中的实体类User user = userService.getByUsername(token.getUsername());//System.out.println(user);if(user != null && user.getStatus().equals(1)){// 参数列表(实体信息,密码,盐值,realm名称)return new SimpleAuthenticationInfo(user,user.getPassword(), ByteSource.Util.bytes(user.getSalt()),getName());}return null;}
}

三、配置ShiroConfig

/*** Shiro配置类*/
@Configuration
public class ShiroConfig {/** 倒序配置*   1、先自定义过滤器 MyRealm*   2、创建第二个DefaultWebSecurityManager,将MyRealm注入*   3、装配第三个ShiroFilterFactoryBean,将DefaultWebSecurityManager注入,并注入认证及授权规则* *///3、装配ShiroFilterFactoryBean,并将 DefaultWebSecurityManager 注入到 ShiroFilterFactoryBean 中@Beanpublic ShiroFilterFactoryBean factoryBean(DefaultWebSecurityManager manager){ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();factoryBean.setSecurityManager(manager);//将 DefaultWebSecurityManager 注入到 ShiroFilterFactoryBean 中//注入认证及授权规则return factoryBean;}//2、创建DefaultWebSecurityManager ,并且将 MyRealm 注入到 DefaultWebSecurityManager bean 中@Beanpublic DefaultWebSecurityManager manager(MyRealm myRealm){DefaultWebSecurityManager manager = new DefaultWebSecurityManager();manager.setRealm(myRealm);//将自定义的 MyRealm 注入到 DefaultWebSecurityManager bean 中return manager;}//1、自定义过滤器Realm@Beanpublic MyRealm myRealm(@Qualifier("hashedCredentialsMatcher") HashedCredentialsMatcher matcher){MyRealm myRealm = new MyRealm();// 密码匹配器myRealm.setCredentialsMatcher(matcher);return myRealm;}/*** 密码匹配器* @return HashedCredentialsMatcher*/@Bean("hashedCredentialsMatcher")public HashedCredentialsMatcher hashedCredentialsMatcher(){HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();// 设置哈希算法名称matcher.setHashAlgorithmName("MD5");// 设置哈希迭代次数matcher.setHashIterations(1024);// 设置存储凭证(true:十六进制编码,false:base64)matcher.setStoredCredentialsHexEncoded(true);return matcher;}
}

四、从前端获取数据进行登录

    @PostMapping(value = "/login")public Result login(@RequestBody UserVo userVo){//System.out.println(userVo);Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(userVo.getUsername(), userVo.getPassword());try {subject.login(token);System.out.println("OK");}catch (UnknownAccountException e) {...} catch (IncorrectCredentialsException e) {...}}

-----------------------------------------------

五、其他

5.1、加密工具类

生成随机盐工具类:

public static String getSalt(int n){char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890!@#$%^&*()".toCharArray();StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < n; i++) {char c = chars[new Random().nextInt(chars.length)];stringBuilder.append(c);}return stringBuilder.toString();}

加密密码工具类:

public static List<String> encryption(String password){List<String> msg = new ArrayList<>();String salt = SaltUtil.getSalt(10);msg.add(salt);Md5Hash MD5 = new Md5Hash(password, salt, 1024);msg.add(MD5.toHex());return msg;}

返回值是一个String类型的数组,其中msg[0]是盐值,msg[1]是加密后的密码,可以一并保存至数据库中。

SpringBoot+Shiro实现MD5密码加密认证相关推荐

  1. shiro 使用md5密码加密 锁定账户

    此篇博客根据之前写的shiro快速配置延续的,建议不了解的可以先看看之前的博客. springMVC中快速配置shiro 1.为了使用密码加密,我们新建一个对用户信息操作的工具类 package co ...

  2. SpringBoot Shiro 配置自定义密码加密器

    SpringBoot Shiro 配置自定义密码加密器 自定义认证加密方式 /*** 自定义认证加密方式*/ public static class CustomCredentialsMatcher ...

  3. Spring Boot 整合 shiro 之盐值加密认证详解(六)

    Spring Boot 整合 shiro 之盐值加密认证详解 概述 不加盐认证 加入密码认证核心代码 修改 CustomRealm 新增获取密文的方法 修改 doGetAuthenticationIn ...

  4. 简单的MD5密码加密和解密方法

    MD5的算法是不可逆的,MD5被广泛用于密码验证和消息体完整性验证. 下面的例子用到了密码加密和登陆时的解密的基本方法.当然这样很容易被暴力破解,可以做其他改进,如先设计一个足够复杂的密码,然后将他的 ...

  5. SpringBoot使用druid的密码加密

    1.springboot默认连接池 习惯使用springboot的小伙伴通过开始学习springboot链接数据库时,都会尝试着官方文档来 学习,所以springboot默认支持的数据库连接池c3p0 ...

  6. Java——MD5密码加密

    目录 1.MD5概述 1.1.什么是MD5? 1.2.MD5加密作用 1.3.什么要使用MD5加密? 2.MD5加密流程 2.1.工具类导入 2.2.用户注册模块使用MD5 2.3.登录问题解决 1. ...

  7. Springboot 配置文件中用户名密码加密

    原配置文件内容 详细操作步骤 1.在pom.xml文件中加依赖 <!--明文加密--><dependency><groupId>com.github.ulisesb ...

  8. SpringBoot + Shiro 缓存记住密码

    一般来讲,记住密码的基本处理,就是把用户的一些基本信息(密码)存入浏览器的Cookie,下次登录的时候优先验证Cookie,后端做处理:以此来实现记住密码的功能!使用shiro自带的RememberM ...

  9. node插件, MD5密码加密 与 解密

    MD5加密插件 使用步骤1 : github搜索 MD5 步骤 二 : 2.1 安装插件: 终端输入 : npm install blueimp-md5 2.2 2.3 2.4 引入 : md5插件 ...

最新文章

  1. 手机显示服务器无数据返回,服务器无返回数据处理
  2. 文顶顶 iOS开发UI篇—UITabBarController简单介绍 iOS开发UI篇—UITabBarController简单介绍...
  3. 超美的文件夹图标,右键秒改,实用方便适合文件夹分类
  4. 适合 Kubernetes 初学者的一些实战练习 (五)
  5. hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...
  6. Java ObjectStreamClass lookup()方法与示例
  7. 1.1 Python 安装
  8. python3安装setuptools步骤_python在Windows下安装setuptools(easy_install工具)步骤详解
  9. 超级P2P搜索引擎使用教程和下载地址
  10. sql server2008密钥,sql server 2008 r2 序列号密钥
  11. 软考数据库系统工程师是什么?如何备考?
  12. 硬件工程师的心路历程竟让人泪目,一个单片机学员的自我救赎
  13. 致远项目管理SPM系统案例:中建二局项目管理系统
  14. 华东师范大学副校长周傲英:数据赋能,从数据库到数据中台
  15. java--输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
  16. 2019-4-29-win10-uwp-使用-Border-布局
  17. 没有处理程序要使用以下任何注释:javax.persistence.PersistenceContext
  18. 深度学习论文阅读目标检测篇(七)中英对照版:YOLOv4《Optimal Speed and Accuracy of Object Detection》
  19. Microsoft Edge浏览器下载文件乱码修复方法(二)
  20. GC算法与GC收集器

热门文章

  1. 通用量子计算实用化又进一步,俞大鹏团队实现量子纠错领域重大进展,首次超越盈亏平衡点|Nature...
  2. HTML 实现一个简单而精美的登录界面
  3. 【计算机视觉】文本检测综述(含2019年)
  4. Redis深度历险 学习笔记
  5. 末位淘汰制是任何时候的万金油吗?
  6. 纯CSS实现720全景?不用Three.js 也可以
  7. 如何看待深度学习门槛低的说法?
  8. netstat 介绍
  9. java 二维数组的定义及操作
  10. 中国电信服务器集采浪潮信息,浪潮存储中标中国电信2020存储集采,驱动5G“云网融合”...