006 加密

一 . 概述

  在前面我们的自定义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.CustomRealm
mather=org.apache.shiro.authc.credential.HashedCredentialsMatcher
mather.hashAlgorithmName=md5
mather.hashIterations=2
realm.credentialsMatcher=$mather
securityManager.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之中的密码按照密码匹配器的方式进行

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

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

猜你喜欢

转载自www.cnblogs.com/trekxu/p/9048803.html
006