shiro自定义realm支持MD5算法认证(六)

1.1     散列算法

通常需要对密码 进行散列,常用的有md5、sha,

对md5密码,如果知道散列后的值可以通过穷举算法,得到md5密码对应的明文。

建议对md5进行散列时加salt(盐),进行加密相当 于对原始密码+盐进行散列。(盐就相当于加入一个随机数)

正常使用时散列方法:

在程序中对原始密码+盐进行散列,将散列值存储到数据库中,并且还要将盐也要存储在数据库中。

如果进行密码对比时,使用相同 方法,将原始密码+盐进行散列,进行比对。

1.2 MD5测试

package cn.qlq.authentication;

import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash; /**
* 测试MD5算法
* @author: qlq
* @date : 2017年7月28日下午9:31:45
*/
public class MD5Test { public static void main(String[] args) { //原始 密码
String source = "111111";
//盐
String salt = "qwerty";
//散列次数
int hashIterations = 2;
//上边散列1次:f3694f162729b7d0254c6e40260bf15c
//上边散列2次:36f2dfa24d0a9fa97276abbe13e596fc //构造方法中:
//第一个参数:明文,原始密码
//第二个参数:盐,通过使用随机数
//第三个参数:散列的次数,比如散列两次,相当 于md5(md5(''))
Md5Hash md5Hash = new Md5Hash(source, salt, hashIterations);
String password_md5 = md5Hash.toString();
System.out.println(password_md5); // 第二种方法
//第一个参数:散列算法
SimpleHash simpleHash = new SimpleHash("md5", source, salt, hashIterations);
System.out.println(simpleHash.toString()); } }

aaarticlea/png;base64,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" alt="" />

---------------------------------------------------------------------------------------   自定义realm支持散列算法------------------------------------------------------------------------------------------------------------------

新建realm(CustomRealmMd5)   如果未采用md5算法则不用红色部分第三个参数:

package cn.qlq.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource; /**
* 自定义realm实现MD5散列算法加密
* @author: qlq
* @date : 2017年7月28日下午9:33:14
*/
public class CustomRealmMd5 extends AuthorizingRealm { // 设置realm的名称
@Override
public void setName(String name) {
super.setName("customRealmMd5");
} // 用于认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException { // token是用户输入的
// 第一步从token中取出身份信息
String userCode = (String) token.getPrincipal(); // 第二步:根据用户输入的userCode从数据库查询
// .... // 如果查询不到返回null
// 数据库中用户账号是zhangsansan
/*
* if(!userCode.equals("zhangsansan")){// return null; }
*/ // 模拟从数据库查询到密码,散列值
String password = "f3694f162729b7d0254c6e40260bf15c";
// 从数据库获取salt
String salt = "qwerty";
//上边散列值和盐对应的明文:111111 // 如果查询到返回认证信息AuthenticationInfo
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
userCode, password, ByteSource.Util.bytes(salt), this.getName()); return simpleAuthenticationInfo;
} // 用于授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
} }

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Calibri","sans-serif";}

在realm中配置凭证匹配器

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9EAAAEhCAIAAAD3X7QUAAAgAElEQVR4nO2d248k132Y6+/Zp1xs2i7Zu0AWCJgX+2X9khhaPSwbSEI+JCCcGcHLkSNvtFIoobjyOit6JjSocLe9K1qyRupVLGM6K49gJ9JaJDGmjbTjIWVpac9AlOwQ5kVCTh5OXc71V5eu6u7p/j78MOiuqnOpU9XdX5/5dVXylYePCIIgCIIgzmjce3lfLYYkITYq3jp9r2H8ygvff/mVD4LxGzf/6Jd/8eNX/uV/SZb+UiEIgiAIgugcODcxUDw6fa9h/MoL3//CKx/E4uO/+Y1f/qWP49wEQRAEQZzhWLRzrzb3Xt53xufRyXv7X/r8p69/9NHJe49O3tML735pqp8OFM987PrbP/pg0CYGjdy5G2//Ky98/wvf+UAOnJsgCIIgiDMc917eX0xoD1tYc53DGZ/vF879/ZP3vm84t35KBEMf6+bb49wEQRAEQRD9hPawpXejbXzvb981Qy+8+6Wps5wwQx/r5tv/q//6/do4e6cOQRAEQRDE4uOsOvffvGuGXnj3S1NnOWFG7ty91nn2Th2CIAiCIIjFxxl17r/+m3fN0AvvfmnqLCfM0Me63zrP3qlDEARBEASx+Dirzv3Wu2bohS/vf8NZTpiRO3evdSZ3vzQlCIIgCII4K4Fzt4rvvvWuGf/94OHL+9/48//zA2c5YYY+1v3Wmbz56B8IgiAIgiAIObSHLb0bxAJiiGPNqUMQBEEQBFEfOPfmBM5NEARBEASxnMC5NyeW4NyTP/w2QRAEQRAEoT1s6d0gFhBDHOuoc+vVr735I4IgCIIgiE0LpVSuXyVn4d7vUEsTxdXHut8zKuzc2DZBEARBEBsb2sxcWcO51wjZdRfk3Ag3QRAEQRCbHAHhVjj3uiEYL85NEARBEAQxbKjgJLfCudeNRTu3UsoR7lff+BFBEARBEMRmRli4Fc69hsS8Vx/rfs8rnJsgCIIgCKIKnHtzWEXn/vKn/pEfkxu/8O1Xv7P01waxyJhOrvvxjT/49J/+xV8tvW8bGLww1yw4oAw+sQoRdO7p5Lr2MPPj7/Drn3nn708WLorQG0t37h/68cVP/uP3P/iJE9+++5Evf/pD//NbfxQsQqxl/OFXPuWfCa987erB5DPf/rM/X3r3Ni14Ya5ZcEAZfGIVIujcf/iVT2kPcz7+pvc/88Mf/PXCXRH6Iea9hXP3eV41de57n/gn777/Eyf+cvrMt373I7/37If+pNf3o6998mIy2l+1qhYQZ6K397/86eCZ8J37z/zBV7Jv/dlfdN7TZe1+h3blIovckUW+MFcqej9qKxLrekAZ/FWOIY/O/uXk4se+udw+dImgc9//8qe1h/kff1//avb2D77XxPDe2H08eXraZOECWFS706eTx3ffqN9O7k9tb/91Qe1Ck1V07jvX/uk77/6kjF+8eucjn/riXx1enx08879+9yO/+8k02sY3b6RJcnncok9nw7nHTyUujd5ZltPb/mL/i9k77/7kuZf++Nrz063PTP7tf3z5nXd/os+Eh5OrX/39G533FOfuEJ1fmF/75MXyxG318uwn7JdPhw6sq3N3OaDjp5IkST/5mrN8b5QkyVN7oQG3Nv7mjdR5E9vUNzdeTQ3bqjnZrDCc2z/TuvVhIRF07v0vZtrDgh9/k9+/UaeUUXHcIOd+Y/fx6jRwRXx+56594LOKzv35j//U3//Dj8t47MnnH3vy+fLp5z/+U8KLOb1wMblw42tyV755Iy1esfO+9oyq+i/rbbA3CrwBDdvJ9vHKsRStqvriFz5rnglOfPELn21SyUq9vS6+Mz0ejk4vzNc+diExXpKvfexCm1Oxl1N3/FTVgfFTkU/r1Tpqq3tAx08lFy66B+WbN1JzoTng2pDKp9+8kUbenzftzY1XU7O26k42K2znrjWBAaLbGRJ07i9+4bPaw2Iff4IONhfHRbIc52405d0FU6ydue3Vde7gefnCr//0j975cRn6zah8+sKv/3TkhH5t5/zFncP9y8nFnUPx1D+8kSZP7R7/8JXjH96/fjF5Yl9+nTSsqv+y3ga7TyTp9dcW2smlxt27v/Wjd3783Et//J9/54+ufe7gmc/+wX/49Ff/3Sd+/9/8+hd+9M6P7979rSaVzHuIe42V6kzb6PDCvH/9YnL+xv3OjfZy6t55yuhDg/eH9TpqQnR5p73zVHL+xo79RnT/+sX0+o3L5ZGyBvyHr5hvXIc30sj5sGlvbryaGrZVc7JZYfQnfqatYASd++7d39IeFvv4a+KFOPdwzq0ibi0It1Iq5r36WPd7XjV17t2dx37wfz8oQ78ZlU93dx4TXp/3j3+4+0RSvqSt93G9wR3jX2NP7OvX/+4TxX/K7vywLJhTvG4DW4aqKt8XihX5W0NVod7GLhto0dvA3Z1IP185LP+ndnHnMFzPK/YbX6hv1TtaOZ7uZsPH7TufM88EJ27f+VyglLP7wQNn7P796xeTJ27snK+OlHHsqvPBCb9U4ECERsxut+zVU7vHr+2ct7rtHyl5RxYQ7V+Yr+2cD49h4IXZ4NQNHpr6kTQswbGWBRy1QIUr8/rq8k5bvota4vXUbv7XHXD3EBvH1H8r26g3N15NTduSTzazCads5ExbwTMk6Ny373xOe1js4y8gdFUqRW6aWnOnT+dLtfGW7vvG7uPJ07u7j5drrFyMmB77pcr6zfSNamFRkd1u2aunp1WzYUFusn3VnLncWOpXHemPO0oyfj63vP0qOvetZ37m9O8+0HH8t+889uTz/+zp3ymX3HrmZ8JvYeX7jvGaib8ZWYJV6cv5G/fzb9KvBd4gvC2DU+b3r19MnG/hd54q3tTsL+JGWb/F2nnuUKnQ+3JoeqNqJdA3s5JiYXAXwvG2GC3OmBdf2j39uw+C89ynf/fBiy/tekUCux87xMbBqnbH+hQ5vJFG9tQvFTh8oRELnk67TyTWNwTbV+QzsIFz93Y42r8wW1lCzakbOzT1Ixn59F3MUVvl11eXd1rvYBV7Kjq3/xZ0eCO1v9Nu2psbr6ZGbdWdbNaO3HnK//brn2kreIYEnfvFl3Zj89z64y+ipt4iUyIf333DcU3DRcsNvCd+nVYpq5BubPp00ZNq1tlut9zQ/oYQarN2e6vg9OmAYL+x+7j3LSLYH3+UZNbBuX/z1372b3/0gY7/9b9PHnvy+V/auVMu+c1f+9lQqf3Lifk6qV7J9c5dKku+vPy2XeDLTVlDoKrIO2M161CsrcqGW6xz7ng/nW/28sdSqG9hpfN3ob83nWDsvfhCedz92HvxBb+Iv/vBA+fMtZhDGvSAak4oYLqRwxcbWL9d01E8XwkX8XZkAYej/Quz3cyceOqKh0YeSWuStfy8XNBRW+XXV5d3WvNgnb9xv1KQZvPcsSHavDc3Xk3N24qfbM6OhIXYf5NctTMk6Nx7L76gPSz28ecX0e5o+qYljsUTZ343uK0yZNmZPfdLWVgCnhOaX5+6zRiPpRYD2zs9D1+3xHfocH+8URJYk9yS7KM/99bb73/tW288e+9P/sVH/9tjTz7/n+58862339eRffTn/CLmv8nM13xn5/ZfVHM492s758v3IGNt/B3Qe4sMvbfG34JfKf4R5jXk706kb/mbl06Rj+9Cf286wfjcCy++9fb7wXnut95+/3MvvBgraO5+L84tnQzhAQmP2Jl27o4vzFD3wi9M6dTtwxKsxLPFHLWVfn11OKDGnu5fTi7uXDefNsjntofIXLhpb268mtq0FTvZmjq3c/qt2hkSdO7PvfBibJ5bf/zFrE7nSAQSJLo6t4NcqlzozW63cG6pxTmc21k6p3N3/g1l8BxYmHMHzstnt9Lv/eD9r//pdx978vl/vvX5j77wP/7yrXe+94P3dTy7lXpFXt05r1/8xZLD59Lk4s7h2/evX0zOP3e/3EY/PnwuTZ7cPX77leO3i9deWerJ3WOz1Nuv3Hny8p3olsGqzOL3rz+3m8+757Ul5WOnrNeiuYGO3SeS9Pqr5dNQqVd3ru+7Gxv1FO+SZW8jfdPFz5f1RzcbNG7uvVQedz9u7r0UOBO83Y8eYmscQkNanEV+x6RS+YEIj1i43TtPmsX1Y+9I1ezIAqL9CzMfB6OHr+6cd15i5Quz5tSNHZrakbQWGsdlIUdtpV9fXQ6osddFbkA5sMWblTXgb+8+kVRFDou3L+/FtWlvbryaWrUVO9mss+u6TvmLnmkre4YEnfvm3kvaw2Iff16JN3Z3c0e0pqibOneb3JJYqTylZPq0nes9sHNb6SSW778RyJspO9eXc7e9VmDwHCicu8/zKuDc3zl+24/rv/qh756+F4vrv/oht8jhc2ly8ZlDa+FvP5EkT+x/53j/w/m898Vnrj+ZnH/uq8dvf+f41Wf0P8Ke2P/q9YvJE/tGPU/+dlk8ybfRayNbhqsqi6fXX83L5rU998z55MN3dCerssEWnQ30NrpCazedUneeLGb69c5a9RTDUu1OpG96H6un0c38+CsxYqVCkT0//u7pe8+99Mef3Huwc/Prv/rsV5/6+O+VZ0L2/DhQytv94IGzdr8acHtIvZOqDKmUecJ4IxZu986T1cEqHoePVHxHFnA4Wr8wndPPGtLQC1M8dWOHpnYkrYX5cRFf5r0ftVV9fXU5oOZeG2+Y3zne/3D5uDyOxnugu5uJu4+b9ubGq6ldW7GTzRiQ9PpzHy72JXimrewZEnTu7Pmx9rDYx19A6MqfAZoC2ti5Vc1vDp1qQqXMn0vmS3aHn+e2Gnx8dzewNLEq6Mu5u90TJ3gO6GPd6j2kNkLOHTovf+Ppn3/j5L1Y/MbTP19zWhMN4qufuJg8sb/0bsjx7K27wpnw7K27S+/hRgUvzOZxJl5f63pAGXxCjlU7Q4LO/eytu9rDYh9/gg7CyhLz3ty5ez2vmjr3x/79L8ix9FfI2Y9XnzmffPj20rtRE5+4+bIcS+/hRgUvzMZxNl5fa3pAGXxCjpU7Q4LO/YmbL2sPi338LVwXoQdW0bmJIcP49+LyO0MQaxa8vhh8YmVjRc+QoHMrpbSHLVQJYWBwboIgCIIgiOUEzr054NwEQRAEQRDLCZx7c8C5CYIgCIIglhM49+awZOcmCIIgCILY5AgLGs69dkRPgCRRSdLvSRVw7mXvPgAAAMDqgXNvDgMca5wbAAAAoAE49+awSOd+rwHdmuxcEAAAAGBp4NybA84NAAAAsBxw7s0B5wYAAABYDjj35oBzAwAAACwHnHtzWE/nnmVpUjCazLc7BZNRkiRpNmtZoudeAAAAwPqAc28OZ9G5Tw6yra2trfFRuSTk3H1bbnvnNkvi3AAAAOCCc28OZ825j8ZbW9nBwXjxzt0dnBsAAABC4Nybw9ly7qOxNu0jnBsAAADOPDj35nC2nLugk3PPsjQZZTrTO81meba1sZmZf20mkRjLnUonI6OmaNo2zg0AAAAhtIcRmxP9nj5qdZ07SdJsVj4wbXiWpVWJySjgzwF1tr19MgonfOPcAAAAEGLpCkgsOPo9fdTqOneazXL5Hk2UYMOhFRHndibKA9Xh3AAAAADQM2fUuc3rCwbzRHBuAAAAAFgVzqJzz7LUygthnhsAAAAAVpkz69xlCZ2mjXMDAAAAwKoyoHPnd8MxyQ5OesktMVNL0mxiVGBezsRJO8G5AQAAAGAprMi931fHcnFuAAAAAOgZnNsB5wYAAACAnlkR5xZvU7MQzKQUnBsAAAAAemQFnBsAAAAAYK3BuQEAAAAAhgXnBgAAAAAYFpwbAAAAAGBYcG4AAAAAgGHBuQEAAAAAhmVY5z4a27egLGq2Njrdv3Jz/02llHp4befq7VO3kgs7l2sbqt3G2eDCzuVySZP6e0Q3XXbAeQoAAAAA68fA934fH1WPC+12C75+64J27tP9Kzu3DkNVtdVu37DLB0G79fXXV+HY2qA9B5f7nfGfAgAAAMD6sajckpODbCs38IBz33uYPyicWxbcoKcKj2MKLhDz8uADfzO5OPPcAAAAABvFUp37dP9KyKevPHgkC2gT6zUfy/PQchNCo8F8lVj9clcRbgAAAIA1ZkHOLeSWvPng6pUHj/SDfMK7DYIcx5YIud1NKhGcO/g3VmGTDQAAAABgDViIcx+NzR9ROgUP713Wzn1473Lp3A1zS8qNg4/9hbWT0MLEc2fnrs35Jr0EAAAAYL0Z3rn1tUuKH1Mqw7kP7wW9s8ulS2JZ1A0J+rTjwbUPfI+XezVnnwEAAADgrDCwc58cZLZwK3ee++G1ncvXXldKPbp9Uz+oaJXuLCdny9PJzee5hdnxJkXM/sSeAgAAAMCaMaRzh4RbBZxbT2yX8l1RmxPibCnPKMeeqtBEdUOBrs0bUZ6mC53EvAEAAADWkuGcWxu3w/jIce7T/SuVc7tZJQ3nuZvnc8e28f24dnK6thVla3osa4VkbgAAAIC1Z3Xv/R4U1thmwpJWmSS189wC8jy3kAXesH4AAAAAOKOsqHP7+RhBl63N05A3iCWKBFNZYmuFtpyyfj3+UwAAAABYP1bUuQEAAAAA1gacGwAAAABgWHBuAAAAAIBhwbkBAAAAAIYF5wYAAAAAGBacGwAAAABgWNbcuSejJBlNhm8jSbNZq+01Q3etG4sYtHVnOlLnRivT1kSdS9SlbEH96YtFjmEvLKLDbQ/lRJ1L8the3mu6l5FZrdfU/JzNQylw5l6wAItnQOd2bkRZ3gP+7Dm3XEtb525UqdzGLEsbG3v7IcC552e1/GDFnXuiziVq6i0+cx/h/XQ4Mhrm2g6Hcru5qM3UJWfjiTqXqL2273AGAzn3XjqUhq7JoVRqO1HnUnVcPNUjFu2S171GWxacuRcswOJZ1Dz30XhrKzs4yWvufz8iLMK5F1CpduxSup2n/bXTtQS4rJZzrzg4t0l712nC+jn3dmI9nY76HLR1OpTVsXOeyuDcAAOwsNySo3Ex1Y1zt650lqXJKMtSbdmzLB1NJiOce4XBuVuAc5ushqituHNPR9b0be+s06Hcy/LZ9ONMbU/UNs4NsDwW5NwnB1kxze07dz5tq6lEMrfKKv3Z8kAjK9oVRHOVszZSSjflJ1pbPQv2UMjMNtsK6HHYbO0Wi/WzLE1Gk1mWjia5civbuUNt1XQ+PvK6Z9U6p/OxkZePV5zjrPoHsfU5Osmfbof+fWyVav7P5Um4relIXcrUdFStnTYopTH/wV3+p1h//FSddEqZFTb+lHJ2ueyh1JaQA9p8eJvLTXx4nSlJ/dQ/iC3GMDLytYRLiaMhHa+J3f9RfanYySaPRk06r3iKqn6dO95Wl1M0PlDuKmPttnDEN/JQhkd+pi4lajpTl0ZKKbWXqqmynTvUVk3nVV5Vb2968vECWC+GdW4jpbswbte5J6OYneXylhvfLEttFS7LWM/sVZbYCqXypvKnk5HjmTUTv6HVuR8L+xgqFWtIO7euNK/ZcG65rWjnoyMvjIYwhvHj5XwHsjxef1xNi6b3UuOduniP1p8Q+q1cb2k+1ps1epsuPns05v+m80/N4uleanwqxEv5T0ucCk1FsDrvtCUQn3YS2jL7GXDuyPBKB0VAHt6Qc8u7Ju9XbORloqUanmz28XJWmfsllKo5XnXzi4FDKZ6i0VIxigwEJ6r8hFhbnU7RLsPrfysw2cBDGWtIO7e27aLm7SaHUux8z2968eMFsH4sKrfk5CArvNssOMvSaIqEo77Vpl6hSitdwTSeC6XcYkItsY7Kc7pN/TqmwYVgz7I0TbVgiyrdoPPCyMdHQxrD+PGK43926n+G6lLO7JqxypG2vbTLT5Hcf1U3+7xxP4wjMipYptvbhv/DjX+1qDFapVT8czowvPJBaYwwvC2cO1JKGHkBqVT8ZBOOlzOqDY9yt9EoqbXnpidAjDa5JVZbnU7RLsPbwLk361DGRr6YQj7O1KU03yDWaMPO9/+mFz9eAOvH4q4VWKaXmAUlXZUnaF1GE+XNcnteHS41iHN7mR0N57SNcl6aTTnh7RQX24q0I+xTfDSkMeySBh56e60+EuKfWB3nue1/iZ6LT8Q6HwNNSxkIHz/boUnE4G66GBOQ5gfYPM4daFc+KCINB2p+5+6WOSqVkmf1gsfLM7+GR3kIUYuNvFwqTJ1zS221P0W7DG8D556G1qzzoQyOfOHc5YS3U1xqq/2vLDq+6Q2T9Q6wmizOucsfUbrOLc1zN5rJFVbF57KlYnM79yxLEzfdumkeSaiOwA8mS/uua0tw7tbz3GKfW31Hyr9C1M9zT0NNORmHLYQ7kmQsfFjWlGo/5dPqUl9hZuqSl0YZazraqOjcHea5mw9vP87dfp5bKiWKWux4CZOjQqneRU0Y+SZ74SI6d5O2ykqanKLdhlfKd9rwQ2mO/CT8KwhdvKYt4VXZ75sezg2bxLKvFegao0Fc8LzpbLuQmVGcOLPB8VKCcwslwx0NJTq3dW4pmcZcVtdWrPPxkRdGQxqJTpc7CaQON0gPLT825GoDv/txkggjUmhmIgqlHLFwOyDkRYifMcHOO5j/q+3ZueWDEu+hMFB+srg/OeofUGm/4iMv9FAq1fCfKn4rhX/kU4YNjnLN8ZIncWOiFjtF46Wq1p0xqXXuurbKXjU5RbsNr9/0dFQ/b7reh9KspLxQSdC59dqatmKd7/1ND+eGTWJA5z4aB2+J4123xM6MsK8KEnU4N53C+RFhUVWViyGWqnFuu6B1fY9InoVTYGJ0QyjldM/65WLUuaW2hM4LIy+PRnTku15i0PzVf9NZIucKA94nU0DslP3jsFRNM9u5YxPn8VLu2sZzz+6VARp03inS8B/3zn751jJVYaIHJd5DeaC2jdqOM2nvmn6XiIy81EOhlDgawvHaNqpy9itWqvY7UnQ0Yoey8Ynd6GSTc0vibXU7RTsPr7IzFqoOb96hjI287Nw172yRzrsF53/Tw7lhk1jze7/DWuLO9NTNJ9XSLT8YAAAAoCE4N5w1PMPWMyhLv2cHAAAAQAycG84gXm7JdL76cG4AAAAYFJwbAAAAAGBYcG4AAAAAgGHBuQEAAAAAhgXnBgAAAAAYFpwbAAAAAGBYcG4AAAAAgGFZhHOfHGTmnSjdgqf7V27uv6mUUg+v7Vy9fZovvrBzOfagCUKp2iWtGgIAAAAAkBneuU8Osq0sy+LO/fqtC9q5T/ev7Nw6VEopdWHnshMqZMb+NuZaf7PYEqdynBsAAAAAemRo5z45yLayg5Ojsejc9x7mDwrnVo3nuQXVlisRxBrnBgAAAIAeGda5Tw7y+e2wc5/uX/Hmqi/sXL7y4FFsnluen1YRpfZri+l7k80AAAAAAFoxqHNXpi3Mc7/54OqVB4/0g3zCO0RsfjqWfyLnijRfCwAAAAAwJwM6t+nZgnMf3rusnfvw3mXTuYN52Cquy7JzN0z+Dj4FAAAAAJiHwZzbtOyIcx/eC6jwheLSJbEM7FZP/cfCklhIuwkAAAAAUMdQzn003gqSHZzYBR9e27l87XWl1KPbN/WDnCbz3P7yefK5/YIAAAAAAPOzoHvixHNLymtyl/KdUzvPbSJflqThPLdQAwAAAABAZ5bt3Kf7Vyrnrm6Io5pdpaR2oZAx4s+g+1Wh3QAAAAAwP6t77/eG89wxLRY2i60inxsAAAAAhmDVndu/CKCqS/+onR1vpdE4NwAAAADMyeo6NwAAAADAeoBzAwAAAAAMC84NAAAAADAsODcAAAAAwLDg3AAAAAAAw4JzAwAAAAAMy5o792SUJKPJ8G0kaTZrtb1m6K51YxGDNlhbHStc/EFpedos8qAskelInRstuxMAAAADMKBznxxkWxbZwUle88A7VdGPqci1tHXuRpXKbcyytLEcth+C9XZubdeR47XAXY+dNpEudOqZ3lej2Mqbu+ncx5k6l1ix1/ZFBgAAsDIM7Ny5Zlusm3MvoFLt2KWhOU/7a6drie4s3LknoyTNslFk8FbASft27jRNq31dgf2TcZ07VcfL7A4AAEBv4NwLq2WOSmdZmoyyLJenWZaOJpOYNs7TTtcS3Vm0c+fDFttqBZy0b+ceTSajsuQK7J8Mzg0AAOvKKjh3Pm2rsebkCj0KJNoaCbiuRZirnLWRUropP6fX6lmwh0ISsNlW4xwCu8Vi/SxLk9FklqWjSa7cynbuUFs1nY+PvO5Ztc7pfGzk5eMVoUVbQteNpuQKy1FrZbb+SJbbRM5dcTQip418vKL7VXwfyxfmleuK892ppNvZv+DwShV6pZoc45m6lKg9nSiSquNJnigyrSq0c0hwbgAAWEcWl889PlJlzcZWk1Hskzv/aM9dYJaltgrb2mPaqWdgoVXWM9srJiNH1ernTr3VuR8L+xgqFWtIO7euNK/ZcG65rWjnoyMvjIYwhsLxEpBGXtiv+BERD6UxaOEaAkv9E8XeY3s0LEeWR6PdhHZ0v7SGp9msfFBVUTyYFf8icV4PweGVKhROAOebrrH3M3VJ23b5QKntRG1PlCqStqdFP4R87u1Vnp8HAACoY1HXLTkalz+iNAvOsjSaIuH4UrWpV6hSAldYjOdCqdD0XyNtbbQ6skVsWUS40mym3SlNLZ2qbSuyoTDy8dGQxjB+vCRqRj62pfxNLVah+b+B8HeCQPv2ImOv/BrMXa4fjfbOHdyvsuaqP55zl9Itf1epr1A8AWLoee5Z/kCr87b3QBO9bslEnUvUpUxuCQAAYHVZ3LUCj8b5XLdZUPrIlidoXUoliAlnvNQgzu1lCjSc0zbKeWk25YS3U1xsq53aBVY1HMNuucLiyIv7FRwoscJA5Q0OSnSeW9bobl/EGi9u6dwqzy+xaokMb12F0RMghuDcxhKNcK1ALiMIAABnmoU598lBFnFuaZ670UyusKqhBPXt3HaaQbs8klAdE/8Hk6V917UlOFzreW6xzz07d5MxDGzY8QtDvBHHTCVpd+e5V8m5tXQ7SSLB4W1aYfgQ9X4AAB1USURBVKCDLkZuybzz3ErtpTg3AACcYRbk3CcHWfj63O5Hv0H8813IFfYSXZ3Z4Lp/rAdbrslNjji3nQjR2rmlZBoVNKNwW7HOx0deGA1pJOp2SHdNTrBwnbtmDKtO1Tt33VGK7EP1n4XIHtnTxlaHOzl3ZIjndu48Mcly7uDwShU2TdO390hy7umo+qHkXmr9htJE53ZzfW4AADi7DOjcR2P/fjh5zdZ29kRiw2sJu/8Xrzas5tvyn4EZdcRK1WYVmwXdn8kFu2EXmBjdEEo53bNyj6POLbUldF4YeXk0oiPfzLllyY3mPtj7FRsoocJQ72ypjB1Kf51Tf2h5TeZ0vEJvv+sOSotpafuLS2x4Ref2B7/ewEXn1o/1ryQvZeo4q5x7OjJ+Q8kFTAAA4Iyz5vd+B5gPz527zPQCAADApoNzA8TxDFtIhgIAAACIgXMDiLi5IMxxAwAAQGtwbgAAAACAYcG5AQAAAACGBecGAAAAABgWnBsAAAAAYFhwbgAAAACAYcG5AQAAAACGZXjnNm5HOT7Ka7Y2ON2/cnP/TaWUenht5+rt03zxhZ3LsQdNCG4s12CubdUWAAAAAIDAoM59cpCVpl3hFnz91gXt3Kf7V3ZuHSqllLqwc9kJ5XlwcBtzbbBIsKPmxsGCAAAAAACdGdK5j8Zb2cGJtzjg3Pce5g8K51aN57ljVh0s1UTThbYAAAAAADowoHNHlNtw7tP9K54EX9i5fOXBo9g8t+/Ktc4d21IZU9oN2wIAAAAA6MBwzn1ykG2Nj4xs7iLJxCn45oOrVx480g/yCe8QMZmO5Z8Ihi3UI7cFAAAAANCB4Zxb23aVzH003tLz3k7Bw3uXtXMf3rtsOrc/0+xnWvuPBaUOLnfKCm0BAAAAAHRjWOe2fj55cpBtZQcnlXMf3gskllwoLl0Sm3Vu9dRHyDnhl5QAAAAAMATD5pZY+dzFRLdd8OG1ncvXXldKPbp9Uz/IaTLP7S+P/XRSrsFfiHMDAAAAQF8MfN2SyrpPDrJ83ttzbj2xXcp3Tu08t4mQii3kn5QLm/s9AAAAAEBbhr0njr5At6a0b6vg6f6VyrmrG+KoZlcpqV0oJ3/7T2vbAgAAAABoy+re+73hPHfDvO3aSwcG5R7tBgAAAID5WXXn9i8CqCLT0ubaJrPjfhOqbnYcAAAAAKADq+vcAAAAAADrAc4NAAAAADAsODcAAAAAwLDg3AAAAAAAw4JzAwAAAAAMC84NAAAAADAsa+7ck1GSjCbDt5Gk2azV9pqhu9aNRQzaYG0tsvND0faMAgAAgJVnOOc+Gm95ZAcnZ9G55Vo6GlKrrjltzLK0sbG3H4J1dW7jy06OddRWZ7dXw7mPM3UuUedGy+0FAADAmrCwee6Tg2xra3yk1s+5F1CpduxSw5yn/bXTtUR3ljDPPcvS4NCd6d3um+1EXcrUNs4NAADQE4ty7qNxPsuNc3eodJalySjLUq2KsywdTSYjnLtbhTh3HdOR2p4opXBuAACA3liMc1eT3Crg3Pm0rfvv/twqq4wAS1LMRAHHXpwcAnNtpJRuyk+0tnoW7KGQmW22FXC8sHbZLRbrZ1majCazLB1NcuVWtnOH2qrpfHzkdc+qdU7nYyMvH68ILdoSum40VVOhCjh3/UB12+UOB0U8oyKvk+jZKw9UE3BuAACAvliIcxuT3Mp17skoZgK5RORyMctSW4XLMtYze5UltkKpvKn86WTULtM3tDr3Y2EfQ6ViDWnn1pXmNRvOLbcV7Xx05IXREMZQOF4C0sgL+xU/IjWHUrWe5+64yx0PSnS1XcUsS6sdk3ZZPvrS9wylcG4AAID+WIBzW5PcynbumP8o5flStalXqBILVzGM50Ipt5hQS6yjsl029euYBheCPcvSNNUuJ8pUg84LIx8fDWkM48dLombkY1vK39TkCts5dz+7PO8Z5X+DMdqSdjk+UE3AuQEAAPpieOc+OciMSW5lO7fkHq2m6PSWnpo4Xh0uNYhze0kEDee0jXJemk054e0UF9uKtNPUbhuPYbccZXHkxf0KDlT/zt15l7sclOjqQJ+jXzTdwpGBagLODQAA0BeDO7edV5LXXD4O/e/fXNdoJldYFZ/LlorN7dzWv/4jFdQpqlnHxP/BZGnfdW0Jzt16nlvsc8/O3WQMAxsO4dztd7njQYmu7jzPHe0UuSUAAAALZWDndvNK8pqrJ66cGMS9RMgVNlSymN+zZoPjpepmCuOKFHFuJ+u3rXNLyTTmsrq2Yp2Pj7wwGtJI1O2Q7lp0ttZ92mQMq0714NyRfeu0y10PSrzeQD53ZLZdft20murGuQEAAPpiUOc+OcjcSW7lX7fE/id8g59/+YXMDasJvDSbVbkYYqlaazELWnoXSTpwCkyMbgilnO5Zv1wUfgkYb0vovDDy8mhER76ZczubSG3F9ys2UHKF/sg7gxobqC673OmgSGeUszZ+gISso4bCnd8Nx4xUHTcpCQAAABHW/N7vAAAAAABLB+cGAAAAABgWnBsAAAAAYFhwbgAAAACAYcG5AQAAAACGBecGAAAAABgWnBsAAAAAYFhwbgAAAACAYcG5AQAAAACGZVjnPhpvVRQ3pMS5AQAAAGCjGNC5j8bmjd9PDrKtrfGRwrkBAAAAYMMYzrkrya6eZwcnODcAAAAAbBhD5pbozBKt3Ufj8iHODQAAAAAbxdC/oSwzuqsZb5wbAAAAADaKIZ375CArMrrNKW+cGwAAAAA2isXlc5fZJTg3AAAAAGwUwzm3fdmSfAHODQAAAAAbx8Dz3NVEd5VognMDAAAAwEYx6G8otXZvOb+ixLkBAAAAYKPg3u8AAAAAAMOCcwMAAAAADAvODQAAAAAwLDg3AAAAAMCw4NwAAAAAAMOCcwMAAAAADAvODQAAAAAwLDg3AAAAAMCw4NzQhtdvXdi5rOPa68vuDAAAAMAZYVjnNm9EWd4F3i14un/l5v6bSin18NrO1dun1ZoLO5eDjx2cVdoIa0sNQemjul3naXB7uarO3ehWsDEPr+HcAAAAAI0Z0LmPxltb2cGJfnJykBXa7RZ8/dYF7dyn+1d2bh0aaxznDvqrqddBT/X1168qtjZoz8Hlfmf8pypkw7IfC7Ie25faOvsA5wYAAABowWDObUh2tWB8pILOfe9h/qBw7piz+o9jCi4giK88Qe70Kli8dp67rRA3n+AXetg3ODcAAABACwZ17nKWWyml573HR6Zzn+5fCc3XXnnwSBk+7f/VOMuFeV+HDs7dYV65Vt8bdrjJ8tj8evE/hIfXgknYRnJ2/rUnuCrP/DHxnPt0/8rOrdsPrubb58Wt/1oAAAAAbCzD5ZbYE915Zrft3Eoppd58cFVL9psPrjrm12QOW94m6LLdnDv4t2HHWn0BiLXrLI/luijHuXcuXyiy5N98cLX0YPOxUo9u3zS0+3T/SnUgHl7zjTzs3Jcv3Nx/s3zAXDgAAABAwaC/oTwal7+gzA6OCgd3Ch7eyye2D++5bufkbDgLg9sIk9DCxHNn545lkshOHGw6SG2uSHCG23Zu42epp/tX8qePbt/Mh93YMjwt7R+XiHNfvX2ay/e110PbAAAAAGwqi7tWoJ/PfXgv6KaVI8r+2pCgTzv11D7wPV62YWFtk8n7JvUItdnOHTTpKtvECHva21yFcwMAAADMwcKcu8jmdue5SzN7dPumpWgxtw5mjwg63nyeW5gdb1Ik2G1hL5r33G9Inkdv6NwRIX50+6aVw808NwAAAMCcLMS5dTJ3kdvtObee2LYUzXFH2T6Fp2ZVrZxbGV6r6hzX3F6FkFcFl/uVNyne2LmdfG4TO7dbZ4Tj3AAAAABzMKBzGzfEsS5gYhWsMozdG+IoceI5uI3/VIXyQGonp31kTY9lrQTnsBvmlsjT3k0Xxp1b5dodSiAxrydzc//Q+G1rIB1Ir8K5AQAAAOKs9L3fay2zVSZJ7Ty33JMmuRyxjJS2TbcS8VqtBwAAAIDlcpac25FLOZGjSQJ0cH66NofEaT1Wj/+0tjOxtvx2g9X6/QEAAACAVWClnRsAAAAAYA3AuQEAAAAAhgXnBgAAAAAYFpwbAAAAAGBYcG4AAAAAgGHBuQEAAAAAhgXnXjiTUVIwmiy7M22ZqHNJHtur2fnV7+HqM/AYTkfq3Kj/agEAAFaZfpw7v+VkcXf3iqPxlncvysGdezLq0WYNQ06SJEmzWY8Vnz3nLtheeaPtt4d7aa8aOlHnEjWdv1tKKa2wSRWXsp7qbTmG24k6l6rj4qkesWloS9O5jzOr8+cStdfXKwwAAGCVmN+5j8ZbW9nBwdh3br1Gm/bJQVY8OXvOXVY2y9LetBvnHpYee7idWPOy09Hcuty7c5fdm6lL/Wl3izGcqUumMTtPbVznNkwdAABgXZnXuY/G2rSPPOc+Ocique38+db46Ew7t5bufurGuYelrx5ORwNI4XDOrSeYe8rcaOvce1mu+8eZ2p6obZwbAACgoK98bs+5HeXOs0+ygxPfuWdZGkjecJzUeWqVKVbYCwPZIOGWZlmajDK9Ks1meTZJXqfV7mTkJmGbqSeOQZurAnPjnnOL3ajFTH4opzmnI3Ups3IPps1qMzN6zyUBhwvbWF2pcEOpOtZzyX7mxiRem7kqJG1uDwspzLefNB2Q7fi0sSO7zlMna2IaWuhng1gblPsldt5qd7KkMZypS4maztSlkVJK7aVqqmznjpwbODcAAGwIgzm3kVhyNN7a2soOjvKJbrugr7HGiphzy3PEkbV2S0aaiDbxNJuVD4wq7HxuT5KdCs1n1bbBfQw6d6wbTla56/Hbvk4ppcpM31G1WZOsA619U7OSBs7dpFSAQsW0nJmVOBVa07eF25Wdqe+hznZI1XH5oMk87kxdim8jObc8kx1Zq49XuXwvLXxU7LyTz21Wu7gx1M6tbbuoeTt0WJWYz73i/zwBAADozMDOfXSQlctPAs49y9JYfnSdc8elO+jcflZI2bb1oHLcyrndR5G+x78JhNYEnTvaDQFhplCeiI3hmFZD525SKsDEzvrVM6kzpZTaS+1vCHGLbdTDsmZDo4d27mjlwX3x27L7HOt81a5X7eLGsPh/xXGmLqVuD5ueG5OefwMKAACwOgyaW2JeraTKNjELClIp55aYaSKutEed29mw2K6hcys1GZlVhOaenWnv6BR5qJddnVuw2y7O7Zlfcxvr7NzT0JrtxM5GSLwp21bZLwt27qJs+Foiced2EqDNWeR65y6yicziCxrDiTUlP/U63/Dc4DKCAACwrgzm3NZVS5QyErxd5+4wz23iX0tkoHlu8Yncp7nnuaXcEuFHfmdlnnvaoBsmVdJF8x52c26vLZOmw+tfS2SgeW6v5sWN4SQwSnvehLfQVtUrnBsAANaR4ZzbvDygcdUS57ol8avvmZIs/p7Qm8GOXFwkkM+tnzV3brut+EVM7DW694PNcwuXh6uVQp0K7JQ1JT6fCm3g3LWlgm0Jzu0kAZtYZjbpbZ5b6GHwWoFmD53Ueb/DVrWR6fNAPveovvP+dUvKthY2hsEEp7InTc6osrdcnxsAANaSeZ07TyEx8a9WsmXdMOc957oldhZGOHljNJllaamfTt6Gr+zmBuZaa7rY0u+Gzh0097rUkjSbGJ0PTFk3UP8ajDQG57olTZw7KFtlVU7qgpurMKovJbUl/tbQvcqHfRXq8oIb06xBDxs7d1AHzSQNs8i20cqx0Q2n5/43InMDc63Vf3t/Gzq3k0q+mDGUnVvZ58ZxrC0uYAIAAOsL936HGrql2JKYCwAAAFCCc0MNODcAAADAnODcUAPODQAAADAnODcAAAAAwLDg3AAAAAAAw4JzAwAAAAAMC84NAAAAADAsODfAuhC6GSQAAACsAjj3wrFu9bPszjSg8Y155mwjfDtSYftVHsNFDJqHea+ZxbCIq9NMwjcVkrf37160OnBJHwCAzaQf587vN2nf+z22anDn7tV3nNtGtvDCBhWvpi869NNRuZa2zt2oUrkNfafQZqXbD8GCj65z58iFuWY/+ijei7S1cxe4N66v29j8F4G+QX20S173Gm1ZgHMDAGwm8zv30XhrKzs4GAecO7zq7Dm3fUf3nrQb556fNpVqxy6PnvO0v3a6lujOdJT74nS06JndRTh3V1o490xdStQ5fVt7/6kMzg0AAM2Y17mPxlqnj3znjq06w86tTa2funHu+Wnr3KMsS7Vlz7J0NJmM1sK5t4tp4L0U565o69x7WT6Mx5nanqhtnBsAAHqlr3zugHPHVnnOnU85OskbjrU4T60yxQp7YSAbJNxSYWP5wjybJK/TancyctMRzNQTx7HMVQG186xM7EYd4T1TuVVWXenSeWdtpJRuyk+0rjkocmZ22zEMtFisn2VpMprMsnQ0yZVb2c4daqv2jJLP3mqd0/nYyMvHK0KZCBHTRL2BjipJo/jB5XYwI8XIinYFcWLlsVhrI6WmI3UpsxJgpkopnYCeuGH1UMiWMdsK/XI06NxOi7ob2rmnM3VplA+XO5ihtmo6r/Kq/FXauaviTudjIy8fLwAAWHmW7ty+xhorYs5dnxwc87dQmog2ozSblQ+MKmz59CTZqdB8Vm0b3Megc0e7IRIdw6L3ufGZXRQ670zmm50QSvlfVSzPrNmV0OoOYyg0pJ1bV5rXbDi33Fa08+LZGxkN6bSJHi/nO5Dr8aWH+c697Utz3pZVRCvgVLmPlRbHogZnlTllK5TKbbt4uu24ad1UccCeCz8W9jFQKtaQdm5t20XN22aqidBWvPOxkRdGQxhD4XgBAMCZYMnOPcvS2L/365w7bnBBQ/KzQsq2rQd6G9u53UeRvse1spEbit0QEMbQVd9qU6HzbqPGc2mX5f9LdHHu+i1iyyJfuYrRTdNUHt6Gne909oqnTfR4NcCYHy3N+ziLXz1wYju6zq+YKaXUXhp1YkdkTecWSjnZFG5yRQfntglma8ScOzxlnqpjpY4zdanIz4k12rDzwsgLoyGMoXC8AADgTLBk5xZUq8bhjH/pu1YSde7AP/jzRIMmzm3Ni6rw1KMzfxmdIg/1sqtzSxvJE7TBzntfThyvju3yAM7dfgy9cl6aTTnh7RQX2xL+c9L67BVPm3nSwCe5uu2lle1JqcPyBK0XU5V7Xsy5o6WGcW4zbSOQABOT5uL3kcE0m3LC2ykutRXpvDDywmgIYzhQ1jsAACyMFXDuDvPcJv61RAaa5xafyH0adJ5bGMPmM7nCqvhctlRsbufuNIYOZh0T/weTpX3XtSU4d+uzV+xzq+9IdtPHxk8ALdkV57mnoTXCvLIwzy2U6t25ze8VgQrr+qNUrte5dofuJVT+ILWmLcG5289zS33GuQEAzjjLzueOX33PlGQ7OzawoVVD5OIigXxu/ay5c9ttxS9iEkrS7cO5dU0hdYy4X1zwhCuwGCpZzP5as8GN8meC/5eI+3HEuduOoYuQTKOCIx5uK9b5+MgLoyGNxBzz3Pp3ispJIzbN0m0r6nBCrrCpkvnsbySf2y0lOLc3fe4Qdm4n0bmtcxuJHME8kHJtTVuxzsdHXhgNKUsb5wYAOOPM69z5LW9MsoMTpYRV7znXLbH/qx9O3tCXgIjkAfjSY25grrVmCy39bujcQXOP1Vn1YGJ0PjBj2UD9rbK+lcXGUHS4aOeNPuY/6TTqiJWq/b9E8KBER6PbGMbPDdG5pbaEzgsjL49GdOQ7OLeRLBG8dIazgXNVkGmkVveiHM6PCIuqnDtfxkrVOLdd0Lq+RxLphrlTqZpmdluRUk73rF8uxp1baEvovFvQu25JbDSiI49zAwCccbj3O8A60PR60gAAALAMcG6AdWCbSVAAAIAVBucGAAAAABgWnBsAAAAAYFhwbgAAAACAYcG5AQAAAACGBecGAAAAABgWnBs2j9B9BwEAAACGA+c2mIzcO57A0Fg3PlpQm8febU02kUl14xX5fo0AAAAwP/04d37LSe/e70dj7+6UZ9G5W98d0KlI33ZwYUp5FpnjpudtcG5SOKxr9nrjQKfn4du5d6L2HukAAAAwP/M799F4ays7OBh7zn1ykJVLTg6yUrtX17ljtBXC/NbehXQ7TyHAIpx7OspTSqajhVhm785t3/m8L+3GuQEAABbAvM59NNZefeQ7t8XJQVas3wznHmVZqi17lqWjyWSEc0sswrm3C0/dS8+4cyu1l/aWHoNzAwAALIC+8rm7O3c+CxzM6TWSfT0js8qVPuu4m/U0996q0mrDSFax3Te7rVmWOp2ajPKVsyxNRpNZlo4muXIr27nN/bIXp9ksmuEcKRXsZ3DXrPqE0RCQSwnHK975crVVovjekm+fF682kU6bCHtpLsHbidoLff/RGzjJG47sOk+PMyvlYxpa6GeDWBuUv+acqUuJ2suKhROrTqvdiZcYYyRnuy4+CbVl4Dq32A0AAADoxoKcO5pbEp/ftJ3WMdzJKCJaNc4tOnO0N8JiR6T1Vtq5tW3n5m04d74ksCO2WNrVx0tZO2IPjDSG9aMRIl5KaiveeX/wzAqSNJuVD8xtoqeNqfYBxd8u7NN37m3fVpVSsnPLM9mRtTozu1y+lxYqPFOXtOaWDwwhdvK5zWq1wVsVmlkoRueD+xh07lg3AAAAoBsLce6jsfkjSs+5g/Y0y1J7PtTQLG9dcCvvqePIgVraObdVoVlbIdizLE1TbZuiJJrCHOt801JmP6QxbDAasYaDpcS24p2PLivrq+zdce6uuSjGvG9p3sdZ9OqBtc4dldGgc8/UpeC88sx9oLexnHsUrnYvtXO7498EnH3RhOe5I90AAACAbgzv3PraJcYqJ7fEzBKIpF+4KQQNZdR9Wp8z3NK5HeV0k1jMpWYVXiZII+eOlorPc0tj2DGDutUEszPtHVwTq1d2bhU7bZrsQu6d1QRzREZVaJW7pZ4MDl5LJO7czix7brQNnVup6chqa9tOYnEmws2EmUDmCc4NAACwEAZ2bn0RQXu569wlsyxNzLniqBI6k63uqsU5t5nf7OVlW9uV9m3tpFN3vPNSKcdnm02UD+LckeqkzkeX1Tp3uPqa3BKl1HGWC6uZklFe0sSnxrmrbnjXEhlonturWRBi83tFrPM4NwAAwAIY0rlDwq2k65ZY+QlShrFrcc4aMwGhD+eu68poNDJXh9I0AgpZdbGhc4dLWTPsLTpeNxq6EXc/mubfx9fYuxytt7lzN02LySknia3k5vjV91w1j6R9Kz/Hw9dro5KpUSqvsLlz2205+dxOlxxTx7kBAACWwrzOnd8NxyRP3A6s0QJuOrczR+uYk5uRYAqXvS6clDKauCkfQoZxLC3Cay3YSbdrUed265oYPZQm6eOlAr13vgAEVzVz7oa/Mq1pS97lYOdF55ZPm0jnqiSQcCqIvUE4eWNk3cPSuT6Jr+zmBuZa6weRtvc3dG4nldy9UopdZ3nRkmlmJai4GSkN1B8AAAC6wb3f56XdLGv/hK/40fH3hRtA7EKBAAAAAMOBc8/H0gXX60A87waUUmqbS00DAADAwsG5O1KmNyx/RtnNz1h+jwAAAADABOcGAAAAABiWZTr33/z9/yMIgiAIgiCItQ+cmyAIgiAIgiCGDZybIAiCIAiCIIYNnJsgCIIgCIIghg2cmyAIgiAIgiCGjX6cO7/npH2bd+dGlOVKnJsgCIIgCILYqJjfuY/GW1vZwcHYc24LvdUJzk0QBEEQBEFsXMzr3EdjbdpHNc6tjsbFepybIAiCIAiC2KjoK5+7xrlPDrJimhvnJgiCIAiCIDYrhnVuI6W7MG6cmyAIgiAIgtiwWNA8t7Zv7d04N0EQBEEQBLFRsSjnNtJLcG6CIAiCIAhio2Jxzl3+iBLnJgiCIAiCIDYqFuXcXCuQIAiCIAiC2NSY17mdG9+Yv5Y8GgdviYNzEwRBEARBEJsV3PudIAiCIAiCIIYNnJsgCIIgCIIghg2cmyAIgiAIgiCGDZybIAiCIAiCIIaNZTo3AAAAAMAmgHMDAAAAAAzL/wdZqLRfv5pEUAAAAABJRU5ErkJggg==" alt="" />

测试:

// 自定义realm实现散列值匹配
@Test
public void testCustomRealmMd5() { // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:shiro-realm-md5.ini"); // 创建SecurityManager
SecurityManager securityManager = factory.getInstance(); // 将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager); // 从SecurityUtils里边创建一个subject
Subject subject = SecurityUtils.getSubject(); // 在认证提交前准备token(令牌)
// 这里的账号和密码 将来是由用户输入进去
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
"111111"); try {
// 执行认证提交
subject.login(token);
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 是否认证通过
boolean isAuthenticated = subject.isAuthenticated(); System.out.println("是否认证通过:" + isAuthenticated); }

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIUAAABGCAIAAABtxMBxAAADmUlEQVR4nO1ay7GDMAx0XRREPVRDMxTDO4SA/pY9eTNKZveQIVisZK1twKKdFPvaWmvr/pw5tqW11pbtoGfI3/syetUZGPvI+Boi5AHyCI9tYWf8PiQJp5j2lZrua2siQkW0ryxDZkLcCOTFiehiX4OEN0u/XyI144SMKMn0kpWh6+PYlidyOarCCGzjCB1f44R+v0QD8zxFeMPVo3vpPT+ulYLjuZA2G4sZxdOldA+toLWvKcK4X7w1pXNEGGbjMcjoAVQB9KgF6FEL0KMWoEctQI9agB61AD1qAXrUwqMH2UtRL8FR2/u9lL13Ghsz2Vdr29c8YRA7I02/+YfJMLORwnXh8+dNIfcl6M6b3bb1dtDSG0+RrxnCoF98Q/EDhOlseLzLspj7JSw2ucdKG/f1ddTb0czuyka+pgg1PU8m4Z7ZyOcc2Ww4RMt2OPtX1I0IU5cozm4E6cmR8jVCGF9HaxgTOXQDGd7fvWlsPdg0JCNxX1try7brIMLe5Mdyytfs5LDXv/teMCGvt6CO6vEUXiw9rkzwVXYnTMagCPQwhxC/Od/OUr5GCIN+nSydUbnPgyakDUOVxrex0gP12nnCKSbUa10m1GuHfaFee6pm1Gs9QtRrfxDQoxagRy1Aj1qAHrUAPWoBetQC9KgF6FELjx76vbO1Tqu2bOoFU5zRBkZMhM2LJ6DKuJDIb179M1jGZZvfsXyTR5vXNS92NzYXNfWIx6OwpAeRg5EJERjks/w7esg268ytRGAWk+RtkkMkP5I0zA1CVo5btoPsi9NquSyfUEHpTvqI0GP3D/qXsfAlSDd5PLFNUysVPQjk6XqU8ObHldZLIPEth6cHLwuMFQkmn6+CHsZ6nGGWhU134JsMn9bDrlf6eqgq2shiGN1agzEYMarUdJOofXXnh+dL26QQ6eFXZW09rE/3hvSQp0ZW82DMniN6mDFM+Arij/BpPaafDez+mP0PdNJ/9a82yOihYwtcezZ9hbxF3s+tvJc07/4xhoHxlddDyyCOvXQLe2EQz4/bYEYP/qDFP3eKPiy7sO70O9JTP7aN3s+D4Sw6ZkKYiQPvuKtHJ/Qw2i+FMZC9dA/Nm26KA2npbIhtujF/Hb417l8F9KgF6FEL0KMWoEctQI9agB61AD1qAXrUAvSoBehRC9CjFqBHLUCPWoAetQA9agF61AL0qAXoUQvQoxagRy1Aj1qAHrUAPWoBetQC9KiFP2FAZq35Ha8iAAAAAElFTkSuQmCC" alt="" />

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Calibri","sans-serif";}

上一篇:beta冲刺2/7


下一篇:Deep Learning深入研究整理学习笔记五