通过上文自定义realm分析源码可得https://blog.csdn.net/Kevinnsm/article/details/11183124

用户认证在doGetAuthenticationInfo()方法中进行操作,授权在doGetAuthorizationInfo()方法中进行,如果想要自定义则必须实现AuthorizingRealm类,该类中继承了AuthenticatingRealm;AuthenticatingRealm类中的doGetAuthenticationInfo()方法实现了用户认证,AuthorizingRealm中的doGetAuthorizationInfo()实现了授权


模拟处密码为123的加密后的数据

public class TestShiroMD5 {public static void main(String[] args) {//使用md5Md5Hash md5Hash=new Md5Hash("123");System.out.println(md5Hash.toHex());//使用md5 + saltMd5Hash md5Hash1 = new Md5Hash("123", "x0*7ps");System.out.println(md5Hash1.toHex());//使用md5 + slat + 散列Md5Hash md5Hash2 = new Md5Hash("123", "x0*7ps", 1024);System.out.println(md5Hash2.toHex());//44c42bc682c33a4dae2af47eba4c8011}
}

结果:

1.实现AuthorizingRealm类,重写其中的doGetAuthenticationInfo()和doGetAuthorizationInfo()方法,完成用户的认证和授权

public class CustomerMd5Realm extends AuthorizingRealm {//授权方法@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("授权操作中");String primaryPrincipal = (String) principalCollection.getPrimaryPrincipal();System.out.println("身份信息:"+primaryPrincipal);SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();//添加用户角色(例如:管理员,普通用户等)
//        simpleAuthorizationInfo.addRole("admin");
//        simpleAuthorizationInfo.addRole("user");
//        simpleAuthorizationInfo.addRole("supper");
//        simpleAuthorizationInfo.addRole("common");//一次添加多个用户角色      //用户认证      simpleAuthorizationInfo.addRoles(Arrays.asList("admin","user","supper","common","product"));//将数据库中的权限信息赋值个权限对象(角色标识符:操作:资源类型)simpleAuthorizationInfo.addStringPermission("user:*:*");simpleAuthorizationInfo.addStringPermission("product:*:*");return simpleAuthorizationInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("身份认证中");//获取身份信息String principal = (String) authenticationToken.getPrincipal();//        //模拟根据用户名查询数据库if ("tom".equals(principal)) {//参数1,返回数据库中的正确的账户    //参数2 :(md5+salt+散列加密后)密码  //参数3:salt           //参数4.提供当前realm的名字return new SimpleAuthenticationInfo(principal,"44c42bc682c33a4dae2af47eba4c8011",ByteSource.Util.bytes("x0*7ps"),this.getName());}return null;}
}

模拟测试

/*** @author:抱着鱼睡觉的喵喵* @date:2020/12/28* @description:*/
public class TestCustomerMd5Realm {public static void main(String[] args) {//创建安全管理器DefaultSecurityManager securityManager = new DefaultSecurityManager();CustomerMd5Realm realm=new CustomerMd5Realm();//设置realm使用hash凭证匹配器HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();//使用算法md5credentialsMatcher.setHashAlgorithmName("md5");//散列次数credentialsMatcher.setHashIterations(1024);realm.setCredentialsMatcher(credentialsMatcher);//注入realm到安全管理器securityManager.setRealm(realm);//将安全管理器注入到安全工具类SecurityUtils.setSecurityManager(securityManager);//从安全工具类中获取SubjectSubject subject = SecurityUtils.getSubject();//封装登录信息到令牌UsernamePasswordToken token = new UsernamePasswordToken("tom", "123");
// ---------------------认证---------------------//try {subject.login(token);System.out.println("登陆成功");}catch (UnknownAccountException e){e.printStackTrace();System.out.println("用户名错误");}catch (IncorrectCredentialsException e){e.printStackTrace();System.out.println("密码错误");}//认证用户进行授权if (subject.isAuthenticated()){//1.基于角色权限控制System.out.println(subject.hasRole("admin"));//2.基于多角色的权限控制System.out.println(subject.hasAllRoles(Arrays.asList("common", "supper", "user")));//是否具有其中一个boolean[] booleans = subject.hasRoles(Arrays.asList("admin", "super", "user"));for (boolean roles:booleans){System.out.println(roles);}System.out.println("=======================");System.out.println(subject.hasRole("supper"));System.out.println("======================");//基于权限字符串的访问控制,资源标识符:操作:资源类型System.out.println("权限:"+subject.isPermitted("user:*:01"));System.out.println("权限:"+subject.isPermitted("user:create:023"));System.out.println("权限:"+subject.isPermitted("product:update:45"));}}
}

shiro认证+授权(使用MD5+salt+散列加密)相关推荐

  1. Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03

    从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...

  2. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01

    这个小项目包含了注册与登录,使用了springboot+mybatis+shiro的技术栈:当用户在浏览器登录时发起请求时,首先这一系列的请求会被拦截器进行拦截(ShiroFilter),然后拦截器根 ...

  3. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02

    代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01 1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表 ...

  4. shiro使用md5salt哈希散列加密

    我们先得到MD5加密后的字串 @Testpublic void test01(){//md5Md5Hash md5Hash = new Md5Hash("123456");Syst ...

  5. 【计算机网络】网络安全 : 报文鉴别 ( 密码散列函数 | 报文摘要算法 MD5 | 安全散列算法 SHA-1 | MAC 报文鉴别码 )

    文章目录 一.报文鉴别 二.鉴别分类 三.报文鉴别 四.密码散列函数 五.MD5 算法 六.SHA-1 安全散列算法 七.MAC 报文鉴别码 一.报文鉴别 计算机网络安全措施 : ① 针对被动攻击 ( ...

  6. ASP.NET自带的散列加密口令【转】

    使用ASP.NET自带类FormsAuthentication实现散列加密口令. private void LoginButton_Click(object sender,System.EventAr ...

  7. Shiro 认证授权详解

    1     权限管理 1.1用户身份认证 1.1.1  概念 身份认证,就是判断一个用户是否为合法用户的处理过程.最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该 ...

  8. java shiro原理_Springboot shiro认证授权实现原理及实例

    关于认证授权,需要的数据表有:用户表,角色表,用户角色关联表,权限表,角色权限关联表,一次如下 之前写过了shiro的登录认证,在自定义的realm中,我们实现AuthorizingRealm接口中的 ...

  9. MD5单向散列算法详解

    历史: MD5 叫信息-摘要算法,是一种密码的算法,它可以对任何文件产生一个唯一的MD5验证码,每个文件的MD5码就如同每个人的指纹一样,都是不同的,这样,一旦这个文件在传输过程中,其内容被损坏或者被 ...

最新文章

  1. Android 无法监听安装,Android关于apk安装成功广播监听
  2. Joseph cicyle's algorithm
  3. Python 入门建议
  4. qt creator无法删除文件怎么办?(需要在cmakelists文件里配置)
  5. Java设计模式-装饰器模式 理论代码相结合
  6. SQL语句中timestamp进行排序BUG
  7. datetime 索引_【免费毕设】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)...
  8. 位操作符:与,或,异或 狼羊菜
  9. ERDAS遥感图像配准、及其它一些基本处理
  10. Chrome浏览器扩展开发系列之一:初识Google Chrome扩展
  11. PHP内置函数parse_str会自动进行urldecode(URL解码)
  12. GNS3 中使用 Docker 容器
  13. 华为畅享20为什么没有计算机,华为畅享20有没有红外线?华为畅享20有NFC功能吗...
  14. 汉语计算机语言,汉语是唯一可用于计算机时代的语言!
  15. vue报错:vue.js:634 [Vue warn]: Cannot find element: #app
  16. 【视频】0基础趣学SEO,引爆流量,让客户主动找上门的躺赚神技
  17. 两万字的Redis笔记!
  18. CRC16 - CCITT 计算方法(查表法)| C语言实现
  19. 00_00 python机器学习_各章实例代码汇总(随学习进度更新)
  20. java中输出第一个a的的位置,java小编程--在一个A字符串中找到与B字符串一样的,返回B字符串出现的第一个位置...

热门文章

  1. sqoop将关系型数据库的表导入hive中
  2. DHH观点:为什么我偏爱Ruby?
  3. lamp怎么使用mysql_我的LAMP实现过程——MySql
  4. html5 建筑物模型,基于HTML5的建筑物阴影实时模拟
  5. 对话系统(三)- 优化方法
  6. linux tcp keepalive,[20170504]Linux TCP keepalive timers.txt
  7. HBuilderX代码设置断点或者书签
  8. 设置Tomcat字符编码UTF-8
  9. 如何使一台计算机可以在互联网上访问到
  10. 计算机等级考试二级c语言笔试,全国计算机等级考试二级C语言笔试试题和答案.doc...