博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
006 加密
阅读量:4313 次
发布时间:2019-06-06

本文共 1881 字,大约阅读时间需要 6 分钟。

一 . 概述

  在前面我们的自定义Realm之中有一个问题,就是我们的密码是明文的,这个在实际的项目之中是不可能存在的.

  在shiro之中,提供了加密的模块.我们可以使用各种加密的方式进行加密.

  本节就介绍一下加密组件的使用.


 二 . 加密组件

  首先看一下shiro为我们提供的Hash加密类结构.

我们看到整个类的继承结构图,发现我们可以使用的类就是SimpleHash这个类.

我们使用一下这个类:  

public static void main(String[] args) {        SimpleHash hash = new SimpleHash("MD5","123","trek",2);        System.out.println("加密之后为:"+hash.toString());    }

我们需要看一下结果,这个结果对我们的后面的密码校验器有关.

加密之后为:ab89651adb0399faf79a858a45c8b4ff

我们现在解释一个上面的参数信息:

  (1)加密的算法

  (2)加密字符串

  (3)盐值

  (4)加密次数


三 .密码匹配器

  我们知道我们的密码信息在数据库之中保存的都是密文的.

现在我们使用一个密码匹配器完成这个操作.

realm=com.trek.shiro.base.CustomRealmmather=org.apache.shiro.authc.credential.HashedCredentialsMatchermather.hashAlgorithmName=md5mather.hashIterations=2realm.credentialsMatcher=$mathersecurityManager.realm=$realm

我们配置了一个密码匹配器,其中设置了加密的算法和加密的次数.

然后我们修改一下我们的认证Realm.

//认证方法    @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken info) throws AuthenticationException {        //获取账号和密码        UsernamePasswordToken token = (UsernamePasswordToken) info;        String username = token.getUsername();        String password = new String(token.getPassword());        //这里模拟一下认证        if(!"trek".equals(username)) {            throw new UnknownAccountException("账号不存在!");        }        if(!"123".equals(password)) {            throw new IncorrectCredentialsException("密码不正确!!");        }        //此处说明认证是成功的了.        //现在要返回用户的身份信息了        SimpleAccount account = new SimpleAccount(username,"ab89651adb0399faf79a858a45c8b4ff",ByteSource.Util.bytes("trek"),getName());        return account;                                            }

注意我们将我们从数据库之中查询出的密码放置在SimpleAccount对象之中,然后shiro就会帮助我们自动匹配密码的正确性.


 

四 .原理

  shiro内置了一个密码匹配器,当我们通过Realm之中返回密码信息之后,shiro就会拿这个密码匹配器将之前我们的token之中的密码按照密码匹配器的方式进行

    密码的获取,然后再进行比较.

因此,当我们配置了一个密码匹配器之后,我们就能完成密码的匹配操作了.

 

转载于:https://www.cnblogs.com/trekxu/p/9048803.html

你可能感兴趣的文章
timeStamp和GMT时间的转换
查看>>
探索J2ME应用:如何用GCF通信
查看>>
jquery ajaxform上传文件返回不提示信息的问题
查看>>
实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上...
查看>>
适配器
查看>>
c#截取字符串
查看>>
VS2005中配置 ScriptManager,UpdatePanel,UpdateProgress 等AJAX控件 .
查看>>
使用logback实现http请求日志导入mongodb
查看>>
【 2017 Multi-University Training Contest - Team 9 && hdu 6162】Ch’s gift
查看>>
redis在php中的应用(Hash篇)
查看>>
Docker系列之Docker镜像(读书笔记)
查看>>
Scrapy 多url爬取、爬取post请求、更换代理ip、指定日志等级
查看>>
phpExcel实现excel文件导出
查看>>
Pandas中dataframe以及spark中rdd使用groupByKey进行合并
查看>>
简单字符串处理应避免使用正则表达式
查看>>
了解正则表达式操作符的优先级
查看>>
Spring框架集成FreeMarker
查看>>
用 async/await 来处理异步
查看>>
app开发-1
查看>>
在JavaScript中调用ASP.NET WebService的简单方法
查看>>