SpringBoot+Shiro实现MD5密码加密认证
一、数据库实体类
数据库实体类要包括用户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密码加密认证相关推荐
- shiro 使用md5密码加密 锁定账户
此篇博客根据之前写的shiro快速配置延续的,建议不了解的可以先看看之前的博客. springMVC中快速配置shiro 1.为了使用密码加密,我们新建一个对用户信息操作的工具类 package co ...
- SpringBoot Shiro 配置自定义密码加密器
SpringBoot Shiro 配置自定义密码加密器 自定义认证加密方式 /*** 自定义认证加密方式*/ public static class CustomCredentialsMatcher ...
- Spring Boot 整合 shiro 之盐值加密认证详解(六)
Spring Boot 整合 shiro 之盐值加密认证详解 概述 不加盐认证 加入密码认证核心代码 修改 CustomRealm 新增获取密文的方法 修改 doGetAuthenticationIn ...
- 简单的MD5密码加密和解密方法
MD5的算法是不可逆的,MD5被广泛用于密码验证和消息体完整性验证. 下面的例子用到了密码加密和登陆时的解密的基本方法.当然这样很容易被暴力破解,可以做其他改进,如先设计一个足够复杂的密码,然后将他的 ...
- SpringBoot使用druid的密码加密
1.springboot默认连接池 习惯使用springboot的小伙伴通过开始学习springboot链接数据库时,都会尝试着官方文档来 学习,所以springboot默认支持的数据库连接池c3p0 ...
- Java——MD5密码加密
目录 1.MD5概述 1.1.什么是MD5? 1.2.MD5加密作用 1.3.什么要使用MD5加密? 2.MD5加密流程 2.1.工具类导入 2.2.用户注册模块使用MD5 2.3.登录问题解决 1. ...
- Springboot 配置文件中用户名密码加密
原配置文件内容 详细操作步骤 1.在pom.xml文件中加依赖 <!--明文加密--><dependency><groupId>com.github.ulisesb ...
- SpringBoot + Shiro 缓存记住密码
一般来讲,记住密码的基本处理,就是把用户的一些基本信息(密码)存入浏览器的Cookie,下次登录的时候优先验证Cookie,后端做处理:以此来实现记住密码的功能!使用shiro自带的RememberM ...
- node插件, MD5密码加密 与 解密
MD5加密插件 使用步骤1 : github搜索 MD5 步骤 二 : 2.1 安装插件: 终端输入 : npm install blueimp-md5 2.2 2.3 2.4 引入 : md5插件 ...
最新文章
- 手机显示服务器无数据返回,服务器无返回数据处理
- 文顶顶 iOS开发UI篇—UITabBarController简单介绍 iOS开发UI篇—UITabBarController简单介绍...
- 超美的文件夹图标,右键秒改,实用方便适合文件夹分类
- 适合 Kubernetes 初学者的一些实战练习 (五)
- hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...
- Java ObjectStreamClass lookup()方法与示例
- 1.1 Python 安装
- python3安装setuptools步骤_python在Windows下安装setuptools(easy_install工具)步骤详解
- 超级P2P搜索引擎使用教程和下载地址
- sql server2008密钥,sql server 2008 r2 序列号密钥
- 软考数据库系统工程师是什么?如何备考?
- 硬件工程师的心路历程竟让人泪目,一个单片机学员的自我救赎
- 致远项目管理SPM系统案例:中建二局项目管理系统
- 华东师范大学副校长周傲英:数据赋能,从数据库到数据中台
- java--输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
- 2019-4-29-win10-uwp-使用-Border-布局
- 没有处理程序要使用以下任何注释:javax.persistence.PersistenceContext
- 深度学习论文阅读目标检测篇(七)中英对照版:YOLOv4《Optimal Speed and Accuracy of Object Detection》
- Microsoft Edge浏览器下载文件乱码修复方法(二)
- GC算法与GC收集器
热门文章
- 通用量子计算实用化又进一步,俞大鹏团队实现量子纠错领域重大进展,首次超越盈亏平衡点|Nature...
- HTML 实现一个简单而精美的登录界面
- 【计算机视觉】文本检测综述(含2019年)
- Redis深度历险 学习笔记
- 末位淘汰制是任何时候的万金油吗?
- 纯CSS实现720全景?不用Three.js 也可以
- 如何看待深度学习门槛低的说法?
- netstat 介绍
- java 二维数组的定义及操作
- 中国电信服务器集采浪潮信息,浪潮存储中标中国电信2020存储集采,驱动5G“云网融合”...