shiro:加密及密码比对器(三)
基于【自定义remle(二)】项目增加加密功能
1:数据库t_user表增加一列(盐)
增加字段:salt
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(100) NOT NULL,
`salt` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
2:javaBean增加一个属性(盐)
com\shiro\vo\UserVo.java
//加密 盐
private String salt;
3:mapper层增加添加用户方法
com\shiro\mapper\UserMapper.java
//注册用户
public void addUser(UserVo userVo);
4:mapper.xml层增加添加用户方法
com\shiro\mapper\UserMapper.xml
<insert id="addUser" parameterType="UserVo">
insert into t_user(username, password,salt) values (#{username},#{password},#{salt})
</insert>
5:service接口增加添加用户的方法以及实现
com\shiro\service\UserService.java
/*注册用户*/
public void addUser(UserVo userVo);
com\shiro\service\impl\UserServiceImpl.java
public void addUser(UserVo userVo) {
//加密 盐 随机数
String salt = UUID.randomUUID().toString();
//Sha类型加密 密码 盐 10000次迭代
String s = new Sha256Hash(userVo.getPassword(), salt, 10000).toBase64();
//数据库中存放加密的密码
userVo.setPassword(s);
//数据库中存放加密盐
userVo.setSalt(salt);
this.userMapper.addUser(userVo);
}
6:controller层新增注册用户的方法
com\shiro\controller\LoginController.java
/*跳转用户注册页*/
@GetMapping("/regist")
public String goRegist(UserVo userVo){
return "regist";
}
/*注册用户*/
@PostMapping("/regist")
public String regist(UserVo userVo){
userService.addUser(userVo);
return "login"; //注册成功后跳转登录页面
}
7:构建注册页面
WEB-INF\jsp\regist.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
请注册:
<form action="/user/regist" method="post">
username:<input type="text" name="username"><br />
password:<input type="text" name="password"><br />
<button type="submit">注册</button>
</form>
</body>
</html>
8:用户注册
数据库添加成功:
9:登录改造
1》在shiro.ini中添加密码比对器
resources\shiro.ini
[main]
........略.......
#声明密码比对器(+)
credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
#加密类型(+)
credentialsMatcher.hashAlgorithmName = sha-256
#加密迭代次数(+)
credentialsMatcher.hashIterations = 10000
#true=hex格式 false=base64(+)
credentialsMatcher.storedCredentialsHexEncoded = false
#声明自定义realm
realm = com.shiro.realm.MyRealm
#注册密码比对器(+)
realm.credentialsMatcher = $credentialsMatcher
#注册安装自定义realm
securityManager.realms=$realm
[urls]
........略.......
2》修改自定义realm
com\shiro\realm\MyRealm.java
把返回的SimpleAuthenticationInfo做修改,增加一个参数(盐),realm自动比对
/*查询身份信息
* 触发:subject.login(token)
* */
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//获取用户登录时发送过来的用户名
String username = token.getPrincipal().toString();
//查询用户信息(DB)
UserService userServiceImpl = ContextLoader.getCurrentWebApplicationContext().getBean("userServiceImpl", UserService.class);
UserVo userVo = userServiceImpl.queryUserByUsername(username);
if(userVo==null){
return null;
}
/*多了一个参数(盐):ByteSource.Util.bytes(userVo.getSalt())*/
return new SimpleAuthenticationInfo(userVo.getUsername(),
userVo.getPassword(),
ByteSource.Util.bytes(userVo.getSalt()), //盐
this.getName());
}
10:登录测试
shiro:加密及密码比对器(三)的更多相关文章
- shiro学习(三,shiro加密)
shiro加密 使用MD5加密 认证 //自定义的Realm 域 public class CustomRealmSecret extends AuthorizingRealm { @Overrid ...
- 总是弹出visual studio 实时调试器 三种解决办法
最近服务器老是弹出visual studio 实时调试器很是郁闷呀.关还关不掉.怎么解决呢 ,现像如下图所示: 下面我们一起来分析一下这种情况的原因: 弹出应用程序: Visual Studio 实时 ...
- Shiro 加密helloWorld
承接第一章 初解加密 只贴更改的源码,其他看上一篇. ShiroRealm.java package com.lkk.shiro.realms; import org.apache.shiro.aut ...
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...
- Shiro加密
在开发的时候,很多数据我们都希望是以加密过后的形式存储起来,而不是最原始的数据. 在shiro中也提供了编码,解码,加密,加密算法实现等等一系列的内容. 编码/解码 在org.apache.shiro ...
- Android 视频播放器 (三):使用NBPlayer播放直播视频
一.前言 在 Android 音视频开发学习思路 中,我们不断的学习和了解音视频相关的知识,随着知识点不断的学习,我们现在应该做的事情,就是将知识点不断的串联起来.这样才能得到更深层次的领悟.通过整理 ...
- python装饰器三种装饰模式的简单理解
学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了! 这里就简单讨论下python的几种装饰模式: 一 无参装饰器: # 装饰器 import time ...
- 2017.2.12 开涛shiro教程-第八章-拦截器机制
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 1.拦截器介绍 下图是shiro拦截器的基础类图: 1.Namea ...
- shiro加密简单实现
1.添加shiro依赖 定义shiro的版本号 <shiro.ver>1.2.3</shiro.ver> 加入shiro的依赖 <dependency> <g ...
随机推荐
- 微信内置浏览器对于html5的支持
微信内置浏览器对于html5的支持 来源: 作者: 热度:102 日期:14-06-10, 09:10 AM 我在做针对微信的HTML5应用, 目前遇到的几个问题是 一. 安卓版微信直接调用系统浏览器 ...
- class字节码的结构
class字节码的结构 使用javap -verbose 命令分析一个.class字节码文件时(以下简称字节码文件),将会分析该字节码文件的魔数,版本号,常量池,类信息,类的构造方法,类中的方法信息, ...
- coding++:mybatis 嵌套查询子查询column传多个参数描述
mybatis 嵌套查询子查询column传多个参数如下: 2.代码示例 备注:注意,相同颜色的单词都是有关联的 <resultMap id="blogResult" typ ...
- 深入理解NIO(二)—— Tomcat中对NIO的应用
深入理解NIO(二)—— Tomcat中对NIO的应用 老哥行行好,转载和我说一声好吗,我不介意转载的,但是请把原文链接贴大点好吗 Tomcat大致架构 先贴两张图大致看一眼Tomcat的架构 Tom ...
- XDebug的配置和使用
简介 XDebug是一个开放源代码的PHP程序调试器(即一个Debug工具) 可以用来跟踪,调试和分析PHP程序的运行状况 功能强大的神器,对审计有非常大的帮助. 官网:http://www.xdeb ...
- 条件判断IF
bash中条件判断使用if语句 千万注意分号 一.单分支条件判断 if 条件 :then 分支1: fi 二.双分支条件判断 if 条件:then 分支1: else 分支2: fi 三.多分支条 ...
- Unity引擎入门——制作第一个2D游戏(1)
Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱. 像是炉石传说,以及最近的逃离塔克夫,都是由unity引擎开发制作. 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目 ...
- Activiti组任务
一.Candidate-users候选人 1.需求 在流程定义中在任务节点的assignee固定设置任务负责人,在流程定义时将参数者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义 ...
- 原理解密 → Spring AOP 实现动态数据源(读写分离),底层原理是什么
开心一刻 女孩睡醒玩手机,收到男孩发来一条信息:我要去跟我喜欢的人表白了! 女孩的心猛的一痛,回了条信息:去吧,祝你好运! 男孩回了句:但是我没有勇气说不来,怕被打! 女孩:没事的,我相信你!此时女孩 ...
- 100 Path Sum
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...