什么是Shiro?

Apache Shiro 是Java的一个权限安全框架

一些功能:认证、授权、加密、会话管理、与Web 集成、缓存等
 
Shiro官网地址:[ 点击访问 ]
http://shiro.apache.org/

4个主要功能:

- Authentication 

  登陆,身份认证。完成用户登陆的密码匹配

- Authorization

  授权,权限验证。判断一个请求和一些事件触发是否可以被允许

- Session Management

  会话管理

- Cryptography

  信息加密,对密码的安全加密处理

其他功能:

WebSupport,Web支持,集成JavaEE

Concurrency,高并发支持,多线程情况下的授权和认证

Testing,测试

Caching,缓存模块

RunAs,让已经登陆的用户以其他用户身份操作管理

RememberMe,记住我

Hello Shiro?

演示HelloShiro需要的一些核心组件

导入工程lib目录

导入Shiro配置文件和日志配置文件

没有Maven管理,配置文件就直接放在src目录下

对Shiro的快速入门源码解析:

1、创建Shiro安全管理器实例

        // The easiest way to create a Shiro SecurityManager with configured
// 创建Shiro安全管理器最简单的方式是使用配置 // realms, users, roles and permissions is to use the simple INI config.
// 访问域,用户,角色(权限),行为,都放在这个简单的ini配置文件中 // We'll do that by using a factory that can ingest a .ini file and
// 我们将会使用工厂实例注入ini配置文件, // return a SecurityManager instance:
// 并且返回Shiro安全管理器的实例 // Use the shiro.ini file at the root of the classpath
// shiro.ini配置文件放在类路径的根下面 // (file: and url: prefixes load from files and urls respectively):
// 分别从文件和url加载前缀 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();

2、继续配置安全管理器对象

        // for this simple example quickstart, make the SecurityManager accessible as a JVM singleton.
// 在这个简单的快速入门案例中,使安全管理器实例在JVM中是一个可访问的单利对象 // Most applications wouldn't do this
// 但是在大多数应用中不会这么来干 // and instead rely on their container configuration or web.xml for webapps.
// 并且对于webapps而言,是依赖于它们的容器配置文件或web.xml文件 // That is outside the scope of this simple quickstart, so
// 这已经超出了我们shiro快速入门的范畴了,所以 // we'll just do the bare minimum so you can continue to get a feel for things.
// 我们将只做一些你能继续体验的最基础的事情 SecurityUtils.setSecurityManager(securityManager); // Now that a simple Shiro environment is set up, let's see what you can do:
// 现在Shiro的环境已经部署出来了,瞧瞧我们能干点啥

3、获取当前执行的用户

// get the currently executing user:
// 获取当前正在执行的用户
Subject currentUser = SecurityUtils.getSubject();

获取当前的Subject对象

4、通过Session存储的认证信息来处理授权安全

获取 & 简单的判断

        // Do some stuff with a Session (no need for a web or EJB container!!!)
// 用会话做些事情(不需要web或EJB容器!!!)【测试Session】 // 获取Session
Session session = currentUser.getSession(); // 在Session对象中注入某一属性
session.setAttribute("someKey", "aValue"); // 然后又获取这个属性值
String value = (String) session.getAttribute("someKey"); if (value.equals("aValue")) {
       //是否匹配
log.info("---> Retrieved the correct value! [" + value + "]");
}

5、权限详细的操作

        // let's login the current user so we can check against roles and permissions:
// 让我们登录当前用户,以便检查角色和权限: // 测试当前的用户是否已经认证,即是否登陆 调用isAuthenticated()方法判断
if (!currentUser.isAuthenticated()) {
// 如果不是则把认证信息封装在一个令牌对象中
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
// 对这个令牌对象设置 记住我
token.setRememberMe(true);
try {
// 执行登陆指令,能否成功取决于在shiro.ini中是否配置令牌中认证信息
currentUser.login(token);
}
// 未知账户异常 ,没有此用户抛出
catch (UnknownAccountException uae) {
log.info("----> There is no user with username of " + token.getPrincipal());
return;
}
// 不正确的资格证书,账户的密码错误
catch (IncorrectCredentialsException ice) {
log.info("----> Password for account " + token.getPrincipal() + " was incorrect!");
return;
}
//锁定的账户,该用户的账号已经上锁,请联系你的管理员解锁
catch (LockedAccountException lae) {
log.info("The account for username " + token.getPrincipal() + " is locked. " +
"Please contact your administrator to unlock it.");
}
// ... catch more exceptions here (maybe custom ones specific to your application?
// 更多的授权异常问题,翻阅shiro文档详细
catch (AuthenticationException ae) {
//unexpected condition? error?
}
} //say who they are:
// 说明 这是谁的用户 // print their identifying principal (in this case, a username):
// 打印它们的标识主体,在这个演示案例中,只有一个用户名称
log.info("----> User [" + currentUser.getPrincipal() + "] logged in successfully."); //test a role:
// 测试权限 // hasRole,判断是否存在这样一个角色权限?
if (currentUser.hasRole("schwartz")) {
// 存在,愿施瓦兹与你同在
log.info("----> May the Schwartz be with you!");
} else {
// 你好,凡人
log.info("----> Hello, mere mortal.");
return;
} //test a typed permission (not instance-level)
// 测试一用户是否具备这个行为 isPermitted()
if (currentUser.isPermitted("lightsaber:weild")) {
// 你有这个行为,请明智的使用
log.info("----> You may use a lightsaber ring. Use it wisely.");
} else {
// 对卟住,这只是大师才能用的行为
log.info("Sorry, lightsaber rings are for schwartz masters only.");
} //a (very powerful) Instance Level permission:
// 一个非常强大的实例等级行为 // 判断这个用户是否被允许了
if (currentUser.isPermitted("user:delete:zhangsan")) { log.info("----> You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'. " +
"Here are the keys - have fun!");
} else { log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
}

6、完成安全授权,退出

        // 判断是否完成了授权验证

        System.out.println("---->" + currentUser.isAuthenticated());

        //all done - log out!
// 全部搞定,退出
currentUser.logout(); System.out.println("---->" + currentUser.isAuthenticated()); System.exit(0);

【Shiro】01 概述 & 快速上手的更多相关文章

  1. ESFramework 4.0 快速上手(01) -- Rapid引擎

    (在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强 ...

  2. 从零开始学 Web 之 Ajax(三)Ajax 概述,快速上手

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  3. ESFramework 4.0 快速上手(06) -- Rapid引擎(续)

    <ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家 ...

  4. python的requests快速上手、高级用法和身份认证

    https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...

  5. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  6. Netron开发快速上手(一):GraphControl,Shape,Connector和Connection

    版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一个用 ...

  7. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  8. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  9. Java开发快速上手

    Java开发快速上手 前言 1.我的大学 2.对初学者的建议 3.大牛的三大特点 4.与他人的差距 第一章 了解Java开发语言 前言 基础常识 1.1 什么是Java 1.1.1 跨平台性 1.2 ...

  10. 【技术文章】《快速上手nodejs》

    本文地址:http://www.cnblogs.com/aiweixiao/p/8294814.html 原文地址: 扫码关注微信公众号 1.写在前面   nodejs快速上手   nodejs使ja ...

随机推荐

  1. 高德面试:为什么Map不能插入null?

    在 Java 中,Map 是属于 java.util 包下的一个接口(interface),所以说"为什么 Map 不能插入 null?"这个问题本身问的不严谨.Map 部分类关系 ...

  2. bpmnjs

    在 bpmn.js 中,`bpmnModeler.get()` 方法用于获取不同的模块,你可以通过这些模块来访问和操作 BPMN 模型的不同部分.以下是一些常用的模块和对应的用途: 1. **Canv ...

  3. kettle从入门到精通 第五十课 ETL之kettle 课程源文件分享

    Kettle 是一款功能强大的开源 ETL 工具,被广泛应用于数据集成.数据转换和数据加载等领域.随着数据量和多样性的不断增加,使用 Kettle 进行数据处理已成为许多企业和数据工程师的首选.在过去 ...

  4. LangChain让LLM带上记忆

    最近两年,我们见识了"百模大战",领略到了大型语言模型(LLM)的风采,但它们也存在一个显著的缺陷:没有记忆. 在对话中,无法记住上下文的 LLM 常常会让用户感到困扰.本文探讨如 ...

  5. vue2 实现可拖拽悬浮球

    实现效果 相关代码 点击查看代码 <template> <div class="float-box"> <div class="button ...

  6. macOS Big Sur 11.0.1光盘镜像文件制作

    https://blog.csdn.net/hymnal/article/details/110393501

  7. 十大java应用服务器(web server)总结

    java应用服务器(web server),是指运行java程序的web应用服务器软件,不包括nginx.Apache等通用web服务器软件. 一.Tomcat Tomcat是Apache 软件基金会 ...

  8. ZYNQ Linux使用SPI驱动

    --- title: ZYNQ Linux使用SPI驱动 EntryName: xilinx-zynq-using-spi-driver-in-linux date: 2020-10-14 10:02 ...

  9. 为什么有些IP无法PING通但又能访问

    背景 在调试板子的网络,突然发现板子无法ping通开发机(出现request timed out,),而电脑却可以ping通板子. 而scp.ssh以及nfs等工具却可以正常使用. 原理 找了一些资料 ...

  10. Android案例分享,基于瑞芯微RK3568国产平台!

    开发环境说明 Windows开发环境:Windows7 64bit.Windows10 64bit 虚拟机:VMware15.5.5 AndroidSDK编译环境:Ubuntu18.04.4 64bi ...