首页 > 其他分享 >Shiro安全认证

Shiro安全认证

时间:2023-04-28 10:46:04浏览次数:55  
标签:role1 认证 Assert 安全 user shiro 加密 Shiro subject

学习视频:https://www.bilibili.com/video/BV1Wb411V7uk

学习网站:https://www.w3cschool.cn/shiro/

介绍

Apache Shiro 是 Java 的一个安全框架

Shiro 可以完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。

  • Authentication:身份认证 / 登录
  • Authorization:授权,即权限验证
  • Session Management:会话管理
  • Cryptography:加密,
  • Web Support:Web 支持
  • Caching:缓存
  • Concurrency:shiro 支持多线程应用的并发验证
  • Testing:提供测试支持;
  • Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
  • Remember Me:记住我

注意:Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。

三大功能

1.身份验证

在shiro中,用户需要提供principlas(身份)和credentials(证明)给shiro,从而应用能验证用户身份

a.导入依赖

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.2.2</version>
    </dependency>
</dependencies>

b.在resources下创建shiro.ini文件

[users]
zhang=z3
wang=w5

通过 [users] 指定了两个主体:zhang/z3、wang/w5

c.测试

@Test
public void testHelloworld() {
    //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager  
    Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    //2、得到SecurityManager实例 并绑定给SecurityUtils
    org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
    SecurityUtils.setSecurityManager(securityManager);
    //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken("zhang", "z3");
    try {
        //4、登录,即身份验证
        subject.login(token);
    } catch (AuthenticationException e) {
        //5、身份验证失败
    }
    Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
    //6、退出
    subject.logout();
}

 

2.授权

授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)

a.shiro.ini

 

[users]
zhang=123,role1,role2
wang=123,role1
[roles]
role1=user:create,user:update
role2=user:create,user:delete

 

b.测试

      //身份验证
//subject.login(token); login("classpath:shiro.ini", "zhang", "123"); //判断拥有角色:role1 Assert.assertTrue(subject().hasRole("role1")); //判断拥有角色:role1 and role2 Assert.assertTrue(subject().hasAllRoles(Arrays.asList("role1", "role2"))); //判断拥有角色:role1 and role2 and !role3 boolean[] result = subject().hasRoles(Arrays.asList("role1", "role2", "role3")); Assert.assertEquals(true, result[0]); Assert.assertEquals(true, result[1]); Assert.assertEquals(false, result[2]); //断言拥有角色:role1 失败抛出异常 subject().checkRoles("role1"); //判断拥有权限:user:create Assert.assertTrue(subject().isPermitted("user:create")); //判断拥有权限:user:update and user:delete Assert.assertTrue(subject().isPermittedAll("user:update", "user:delete")); //判断没有权限:user:view Assert.assertFalse(subject().isPermitted("user:view")); //断言拥有权限:user:view 失败抛出异常 subject().checkPermissions("user:view"); }

 

 

3.加密

//密码明文
String password = "z3";
//使用md5加密
Md5Hash = md5Hash = new Md5Hash(password);
//带盐的md5加密,盐就是在密码明文后凭借新的字符串,然后在进行加密
Md5Hash md5Hash2 = new Md5Hash(password,"salt");
//多次迭代加密
Md5Hash md5Hash3 = new Md5Hash(password,"salt",3);
//使用父类进行加密
SimpleHash simpleHash = new SimpleHash("MD5",password,"salt",3)

//生成 Realm
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
SimpleAuthenticationInfo ai = 
        new SimpleAuthenticationInfo(token.getPrincipal()【用户凭证】, password【加密后的密码】, token.getPrincipal().toString()【用户名】);
    ai.setCredentialsSalt(ByteSource.Util.bytes(username+salt2)); //盐是用户名+随机数
        return ai;
}

 

标签:role1,认证,Assert,安全,user,shiro,加密,Shiro,subject
From: https://www.cnblogs.com/xinyu-yudian/p/17080987.html

相关文章

  • Linux服务器必备的安全设置,建议收藏!!
    Linux服务器必备的安全设置,建议收藏!!!入门小站 入门小站 2023-04-2721:46 发表于湖北收录于合集#Linux771个入门小站分享运维技巧及10k+Stars的开源项目237篇原创内容公众号【Linux250个常用命令速查手册】关注【入门小站】,后台回复「1001」......
  • 3C强制性认证条件,3C证书监督审查
    3C强制性认证由于国家对产品质量的重视和环保要求,3C认证已成为各企业或工厂的一致要求,但从认证到认证仍有许多标准,大多数企业仍有些模糊,所小化妆在这里解释下3C认证批准条件以及如何保持认证,希望对您有所帮助。批准颁发3C认证证书的条件1.申请人具有法人地位,在认证过程中履行职责和......
  • 线程安全问题
    线程安全问题一、造成线程安全问题的原因:GIL全局解释器锁每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说python的多线程并不是真正意义上的同时执行。二、多线程共享全局变量Python多线程是通过threading模......
  • c#线程安全
    引用:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/locklock语句获取给定对象的互斥lock,执行语句块,然后释放lock。持有lock时,持有lock的线程可以再次获取并释放lock。阻止任何其他线程获取lock并等待释放lock。lock语句可确保......
  • 智达方通EPM:以安全可靠的国产化替代,助力企业信创化+数智化管理升级
    “技术创新,国产替代”是近年来备受各界关注的热点话题。一方面,信创作为国家战略布局,带动了相关核心软硬件技术的蓬勃发展。另一方面,数字技术、数字经济成为新一轮国际竞争的重点,以5G、人工智能、区块链、大数据等信息技术为代表的新技术在企业管理领域加速应用,赋能千行百业转型升级......
  • 提高网络安全性:探索ADAudit Plus的全功能IT安全审计解决方案
    数据安全一直是企业和组织的重要问题之一,而DataSecurityPlus作为一款数据安全解决方案,能够为企业提供全面的数据安全保障。首先,DataSecurityPlus可以对企业的敏感数据进行监控和审计,通过实时监控和记录文件、文件夹、数据库、邮件和打印机等资源的访问和操作,保障企业数据的安全性......
  • app逆向之安卓native层安全逆向分析(六):frida调试跟栈+unidbg补环境大动作
    前言继续跟着龙哥的unidbg学习:SO逆向入门实战教程六:s_白龙~的博客-CSDN博客还是那句,我会借鉴龙哥的文章,以一个初学者的角度,加上自己的理解,把内容丰富一下,尽量做到不在龙哥的基础上画蛇添足,哈哈。感谢观看的朋友分析 首先抓个包看看: 这里面这个sign,就是今天的重点了这个......
  • 织密“安全云网”,天翼云探索构建分布式多场景云服务稳定性保障体系!
    近日,中国信息通信研究院(以下简称“中国信通院”)主办,混沌工程实验室承办的信息通信领域系统稳定性保障沙龙·北京站成功举办。沙龙以“共筑数字免疫韧性长城,助力信息通信行业稳定安全运行”为主题,旨在促进信息通信领域系统稳定性保障技术交流,推动信息通信领域稳定安全运行水平提升,......
  • Azure DevOps(二)Azure Pipeline 集成 SonarQube 维护代码质量和安全性
    一,引言对于今天所分析的SonarQube,首先我们得了解什么是SonarQube?SonarQube又能帮我们做什么?我们是否在项目开发的过程中遇到人为Review代码审核规范?带着以上问题,开始今天的分析内容吧!!!1)什么是SonarQube?SonarQube是一种自动代码审查工具,用于检测代码中的错误......
  • 02、安全治理
    信息安全治理(InformationSecurityGovernance)是这样一个过程:为了管理风险、建立和维护一个框架,支持管理架构和流程,以确保信息安全战略与业务目标保持一致并支持业务目标,通过遵守政策和内部控制与适用的法律法规保持一致,并对职责进行分配。一、安全治理和安全管理为了区分信息......