shiro学习总结(一)----初识shiro
本系列内容大多总结自官网和张开涛的《跟我学Shiro》
一、shiro简介
1.1、shiro有什么用?
shiro是一个功能强大使用简单的java安全框架,主要提供了五大功能:
1、认证:用户身份认证,也就是登陆;
2、授权-访问控制:通过一些配置,用户登录后会自动被赋予相应的身份和操作权限,实现访问控制;
3、密码加密-保护或隐藏数据防止被偷窥;
4、会话管理
5、缓存
shiro还支持一些辅助特性,如Web应用安全、单元测试和多线程,它们的存在强化了上面提到的五个要素。
1.2、shiro与Spring Security那个好?
Spring Security:除了不能脱离Spring,shiro具有的功能它都有,权限细粒度高,还提供许多其它的功能(笔者没用过,具体哪些功能不清楚),而shiro则需要手动去实现。但是与shiro相比,操作太复杂,概念多,难理解,学习成本高。
shiro:使用简单直接,上手快,控制粒度可糙可细,扩展性强,自由度高,学习成本低。但功能比Spring Security要少些。
个人观点:我认为在满足基本功能需求的情况下具有下面这两个要素就可以称之为好框架了:
一是简单易用,学习成本低。二是扩展性强,自由度高。
shiro无疑比Spring Security更具有优势,虽然Spring Security功能更强,但shiro具有的功能已经能满足大部分开发需求了;
二、shiro的外部结构
什么是外部结构?这里说的外部结构就是指开发过程中会用到shiro API。
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;
shiro的所有功能,如认证,授权等,直接操作Subject实现;
所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;
可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;
可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;
也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;
可以把Realm看成DataSource,即安全数据源。
也就是说,shiro不自动提供给用户权限,需要开发人员在代码中通过Realm注入。
简单点来说,最简单的一个Shiro应用:
1、应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;
2、我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。
三、一个简单的shiro登录实例
2.1、引入包
这里我用的maven构建项目。
因为shiro依赖slf4j,maven仅帮我们下载slf4j的API,所以我们最好导入slf4j的实现,否则会有警告。
POM文件
Maven下载的包
2.2、创建ini配置文件
在ini配置文件中,输入账号和密码。这里为了方便演示所以使用ini配置文件,在实际项目中这些数据都要放在数据库中。
2.3、创建测试类
public static void main(String[] args) {
// 1、读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
///2、获取securityManager实例
SecurityManager securityManager=factory.getInstance();
///3、把securityManager实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
///4、得到当前执行的用户
Subject currentUser=SecurityUtils.getSubject();
///5、创建token令牌,用户名/密码
UsernamePasswordToken token=new UsernamePasswordToken("java1234", "12345");
try{
///6、身份认证
currentUser.login(token);
System.out.println("身份认证成功!");
}catch(AuthenticationException e){
e.printStackTrace();
System.out.println("身份认证失败!");
}
// 退出
currentUser.logout();
}
1、通过 new IniSecurityManagerFactory 并指定一个 ini 配置文件来创建一个 SecurityManager 工厂,这种方法只是用于测试,实际开发不使用。
2、获取 SecurityManager 并绑定到 SecurityUtils,这是一个全局设置,设置一次即可,实际开发中在配置中完成;
3、通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程;如果在 web 环境在请求结束时需要解除绑定;然后获取身份验证的 Token,如用户名 / 密码;
4、调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录;
5、如果身份验证失败请捕获 AuthenticationException 或其子类,常见的如:
DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、
UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、
IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;
shiro学习总结(一)----初识shiro的更多相关文章
- 【shiro】shiro学习笔记1 - 初识shiro
[TOC] 认证流程 st=>start: Start e=>end: End op1=>operation: 构造SecurityManager环境 op2=>operati ...
- [shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39933993 shiro官网:http://shiro.apache.org/ shi ...
- Shiro学习(一)——Shiro简介
Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...
- shiro学习(四、shiro集成spring+springmvc)
依赖:spring-context,spring-MVC,shiro-core,shiro-spring,shiro-web 实话实说:web.xml,spring,springmvc配置文件好难 大 ...
- shiro学习(三,shiro加密)
shiro加密 使用MD5加密 认证 //自定义的Realm 域 public class CustomRealmSecret extends AuthorizingRealm { @Overrid ...
- 第一章 初识shiro
shiro学习教程来自开涛大神的博客:http://jinnianshilongnian.iteye.com/blog/2018936 第一章 初识shiro 简单了解shiro主要记住三张图即可. ...
- Shiro学习笔记(5)——web集成
Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...
- Shiro学习
Shiro学习资源 Shiro官网,http://shiro.apache.org/index.html 学习网站链接,http://blog.java1234.com/blog/articles/4 ...
- Shiro学习笔记四(Shiro集成WEB)
这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...
- Shiro学习笔记 三(认证授权)
第一种首先基于角色的权限控制 1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类 还是首先看一下目录结构 主要用到文件 首先贴一下工具类的方法 pa ...
随机推荐
- 第二十单元 计划任务crond服务
什么是计划任务:后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好.这就用到了crond服务 crond服务相关的软件包[root@MiWiFi-R3-srv ~]# rpm ...
- AppServ安装到一半卡住的问题
今天在笔记本安装AppServ的时候,运行到Installing mysql service时就卡住不动了,因为之前在自己的台式电脑安装过AppServ,当时是一步成功的,所以觉得这个问题莫名其妙,因 ...
- loadrunner获取当前日期、明日日期、昨日日期
DATE_NOW(现在的日期) TIME_NOW(现在的时间) ONE_DAY(一天的时间) ONE_HOUR(一小时的时间) ONE_MIN(一分钟的时间) 可以使用公式获取昨天明天,例如: DAT ...
- Python之yield简明详解
yield在Python中被称之为生成器(只能在函数中使用),他的作用是将函数中每次执行的结果以类似元组的形式保存起来一遍后续使用. 什么是生成器? 通过列表生成式,我们可以直接创建一个列表.但是,受 ...
- Android Studio 配置虚拟设备的镜像文件的存放路径
操作系统:Windows 10 x64 IDE:Android Studio 3.3 Android Studio创建的虚拟设备的默认存放路径是位于C盘,这导致C盘的可用容量变小. 所以,我决定要将虚 ...
- Allegro PCB Design GXL (legacy) 使用slide推挤走线,走线的宽度就发生改变的原因
Allegro PCB Design GXL (legacy) version 16.6-2015 使用slide推挤走线,走线的宽度就会发生改变. 后来发现是因为约束管理器(Constraint M ...
- window下tomcat的内存溢出问题
打开注册表:https://jingyan.baidu.com/article/49ad8bce09d6085835d8fa63.html Tomcat 内存溢出对应解决方式 Windows平台,使用 ...
- SSM文件下载
SSM框架文件下载比文件上传稍微麻烦一点,但这次还是写成最简朴的形式,哈哈~如下 参考:http://blog.csdn.net/lcx556224523/article/details/702076 ...
- Eclipse中java文件生成jar文件的方法
在eclpse中找到你要导出的java程序 选中它 单击文件 -->export 在弹出的export对话框中找到 jar File 单击选中-->next 按图示顺序依次 选 ...
- jmeter 中如何一次运行多条sql语句
在jmeter测试mysql中如何一次运行多条sql语句 allowMultiQueries=true 注意:太低版本的mysql和jdbc不支持,最好用最新版的