【Shiro】01 概述 & 快速上手
什么是Shiro?
Apache Shiro 是Java的一个权限安全框架
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 概述 & 快速上手的更多相关文章
- ESFramework 4.0 快速上手(01) -- Rapid引擎
(在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强 ...
- 从零开始学 Web 之 Ajax(三)Ajax 概述,快速上手
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- ESFramework 4.0 快速上手(06) -- Rapid引擎(续)
<ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家 ...
- python的requests快速上手、高级用法和身份认证
https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- Netron开发快速上手(一):GraphControl,Shape,Connector和Connection
版权所有,引用请注明出处:<<http://www.cnblogs.com/dragon/p/5203663.html >> 本文所用示例下载FlowChart.zip 一个用 ...
- 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...
- EF Core 快速上手——EF Core 入门
EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用 本文是对 ...
- Java开发快速上手
Java开发快速上手 前言 1.我的大学 2.对初学者的建议 3.大牛的三大特点 4.与他人的差距 第一章 了解Java开发语言 前言 基础常识 1.1 什么是Java 1.1.1 跨平台性 1.2 ...
- 【技术文章】《快速上手nodejs》
本文地址:http://www.cnblogs.com/aiweixiao/p/8294814.html 原文地址: 扫码关注微信公众号 1.写在前面 nodejs快速上手 nodejs使ja ...
随机推荐
- jquery的折叠动画 渐隐渐显动画
<button name="up">折叠隐藏</button> <button name="down">折叠显示& ...
- JS获取表单所有内容
var formData = {}; var t = $('#Form').serializeArray(); $.each(t, function() { formData[this.name] = ...
- 利用夜莺开源版对H3C无线设备监控
编者荐语:真正搞监控的人肯定知道 SNMP 水有多深,有时我甚至腹黑猜测,这些厂商是故意的吧,,,指标不标准,格式各异,只能靠一款灵活的采集器了,本文是夜莺社区用户写的文章,转给大家参考. autho ...
- 基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架
#include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <err ...
- The bean ‘xxx‘ could not be injected as a ‘xxx‘because it is a JDK dynamic proxy that implements错误解决
1.解决方法:使用@Autowired 2.@autowired和@resource注解的区别区别:1.@Autowired注解由Spring提供,只按照byType注入:@resource注解由J2 ...
- windows powershell 解压 .gz文件
windows 10下解压.gz后缀文件 打开windows powershell界面,(1)输入cd desktop(文件的存储位置,示例为存储在电脑桌面上), (2)输入tar -zxvf 需要解 ...
- SoftReference 到底在什么时候被回收 ? 如何量化内存不足 ?
本文基于 OpenJDK17 进行讨论,垃圾回收器为 ZGC. 提示: 为了方便大家索引,特将在上篇文章 <以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的> 中讨 ...
- 实验五:FTP远程密码pojie(有敏感词)
[实验目的] 了解远程FTP密码pojie原理,了解如何有效防范类似攻击的方法和措施,掌握pojieftp帐号口令pojie技术的基本原理.常用方法及相关工具. [知识点] FTP口令pojie [实 ...
- ClickHouse的物化视图及MySQL表引擎
MySQL表引擎可以与MySQL数据库中的数据表简历映射,并通过SQL向其发起远程查询. MySQL表引擎可以与物化视图结合,来同步更新MySQL数据库中的数据. 语法: CREATE TABLE [ ...
- 鸿蒙生态伙伴SDK市场正式发布,驱动千行百业鸿蒙原生应用开发
6月21-23日,华为开发者大会(HDC 2024)在东莞举办.在22日举办的[鸿蒙生态伙伴SDK]论坛中,正式发布了[鸿蒙生态伙伴SDK市场](以下简称:伙伴SDK市场),伙伴SDK市场是为开发者提 ...