本系列内容大多总结自官网和张开涛的《跟我学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的更多相关文章

  1. 【shiro】shiro学习笔记1 - 初识shiro

    [TOC] 认证流程 st=>start: Start e=>end: End op1=>operation: 构造SecurityManager环境 op2=>operati ...

  2. [shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39933993 shiro官网:http://shiro.apache.org/ shi ...

  3. Shiro学习(一)——Shiro简介

    Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...

  4. shiro学习(四、shiro集成spring+springmvc)

    依赖:spring-context,spring-MVC,shiro-core,shiro-spring,shiro-web 实话实说:web.xml,spring,springmvc配置文件好难 大 ...

  5. shiro学习(三,shiro加密)

    shiro加密 使用MD5加密  认证 //自定义的Realm 域 public class CustomRealmSecret extends AuthorizingRealm { @Overrid ...

  6. 第一章 初识shiro

    shiro学习教程来自开涛大神的博客:http://jinnianshilongnian.iteye.com/blog/2018936 第一章 初识shiro 简单了解shiro主要记住三张图即可. ...

  7. Shiro学习笔记(5)——web集成

    Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...

  8. Shiro学习

    Shiro学习资源 Shiro官网,http://shiro.apache.org/index.html 学习网站链接,http://blog.java1234.com/blog/articles/4 ...

  9. Shiro学习笔记四(Shiro集成WEB)

    这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...

  10. Shiro学习笔记 三(认证授权)

    第一种首先基于角色的权限控制 1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类 还是首先看一下目录结构 主要用到文件 首先贴一下工具类的方法 pa ...

随机推荐

  1. 自定义Web框架

    http协议 HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本 ...

  2. 【mysql】datetime时间比较

    如下,比较的日期用指定格式写出就可以了.不需要日期函数. SELECT * FROM table_a WHERE write_date > "2017-07-17 00:00:00&q ...

  3. Python判断字符串是否xx开始或结尾

    判断是否xx开始 使用startswith 示例代码: String = "12345 上山打老虎" if str(String).startswith('1'): #判断Stri ...

  4. ajax---获取XMLHttpReuquest 对象

    ajax的异步和同步(Asynchronus Javascript and Xml) 同步:一个时间段只能干一件事:即按部就班,一件事一件事的做. 异步:相同的时间段做多件事,同时进行.依靠 XMLH ...

  5. 几种stl的应用

    1.set(特点:插入后元素自动从小到大排序) set< int > ::iterator it;//迭代器,可以指向同类型的集合 q.find(k);//其中一个元素k的地址 q.cou ...

  6. 目标检测算法之YOLOv1与v2

    YOLO:You Only Look Once(只需看一眼) 基于深度学习方法的一个特点就是实现端到端的检测,相对于其他目标检测与识别方法(如Fast R-CNN)将目标识别任务分成目标区域预测和类别 ...

  7. sqoop无法导出parquet文件到mysql

    1.问题描述 在CDH集群中我们需要将Hive表的数据导入到RDBMS数据库中,使用Sqoop工具可以方便的将Hive表数据抽取到RDBMS数据库中,在使用Sqoop抽取Hive Parquet表时作 ...

  8. 史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)

    上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...

  9. 【C++ Primer | 07】常用算法

    第一部分 常用泛型算法: find(beg, end, val); equal(beg1, end1, beg2); fill(beg, end, val); fill_n(beg, cnt, val ...

  10. nunit单元测试详解

    在粗略看了代码后,下面就详细说明相应的测试标记(属性)的用法. [TestFixture(arguments)]属性标记类为测试类,若没有填写参数,则测试类必须含有无参构造函数,否则需要相应的有参构造 ...