博主最近的公司的大佬离职了。公司之前老的框架交给我来进行管理。然后最近在整理框架的时候发现公司老框架的权限部分还是使用的每次请求的时候都要去数据库中查询当前用户的权限。感觉有点不太合理,所以最近准备使用shiro对框架进行一些小的修改。正好自己也不会shiro所以就一起来学习一下。

首先,我们在学习一个东西之前还是要了解三样东西 为什么?是什么?干什么?

换算到本片文章就是。

  • 为什么要学习 shiro?
  • shiro 是什么?
  • 学习了shiro可以干什么?

ok!!接下来我们一起来学习shiro吧。

一、为什么要学习shiro?

首先我们要了解一下什么是权限。权限通常就是每个用户拥有的不同的权利。

通常权限又是和角色绑定的,而角色绑定权限。

比如 A用户角色是管理员,他有删除订单&查看订单的权限,那么他就可以在订单模块查看订单并且可以删除订单

而 B用户角色是业务员,那么他就只可以查看订单而不可以删除订单

这就是所谓的权限。
【一起来学shiro之一】初见shiro

而权限通常数据库设计是有以下几张表:

  • 用户表(用户基本信息,如姓名、年龄、性别等信息)
  • 用户角色表(用户和角色的关联表)
  • 角色表(角色信息表 如角色名称、备注等)
  • 角色权限表(角色和权限的关联表)
  • 权限表(权限表 如权限、备注、权限名称)

【一起来学shiro之一】初见shiro

介绍完权限之后我们就可以介绍shiro了。

二、什么是shiro?

shiro定义

Apache Shiro™是一个功能强大且易于使用的Java安全框架,它执行身份验证授权加密会话管理。 使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大的Web和企业应用程序。

从官方的定义我们可以很直观的看出shiro主要是帮助我们快速实现

  • 身份验证 验证账户密码、权限
  • 授权 授予用户权限
  • 加密 对数据进行加密
  • 会话管理 shiro实现了一个类似一session的管理,所以shiro可以运行在非shiro的项目中

shiro的架构

【一起来学shiro之一】初见shiro
下面的内容大概了解就好。我们会在学习的过程中更加深入的理解

  • Subject:主体,可以看到主体可以是任何可以与应用交互的 “用户”,我们可以从subject中取得用的登陆状态权限信息等;

  • SecurityManager:相当于 SpringMVC 中的 DispatcherServlet 或者 Struts2 中的 FilterDispatcher;是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进行认证和授权会话缓存的管理。

  • Authenticator:认证器,负责主体认证的,这是一个扩展点,如果用户觉得 Shiro 默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了

  • Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能

  • Realm:可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等等;由用户提供;注意:Shiro 不知道你的用户 / 权限存储在哪及以何种格式存储;所以我们一般在应用中都需要实现自己的 Realm,总的来说realm就是具体去认证用户信息是否正确&查询用户权限并且将用户的权限告知shiro。允许用户自己编写实现方法

  • SessionManager:如果写过 Servlet 就应该知道 Session 的概念,Session 呢需要有人去管理它的生命周期,这个组件就是 SessionManager;而 Shiro 并不仅仅可以用在 Web 环境,也可以用在如普通的 JavaSE 环境、EJB 等环境;所有呢,Shiro 就抽象了一个自己的 Session 来管理主体与应用之间交互的数据

  • SessionDAO:DAO 大家都用过,数据访问对象,用于会话的 CRUD,比如我们想把 Session 保存到数据库,那么可以实现自己的 SessionDAO,通过如 JDBC 写到数据库;比如想把 Session 放到 Memcached 中,可以实现自己的 Memcached SessionDAO;另外 SessionDAO 中可以使用 Cache 进行缓存,以提高性能;

  • CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能,用户可以自己实现不同的缓存管理期。如使用redis进行缓存。

  • Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密 / 解密的。

三、学习完shiro可以干什么?

学习完shiro之后我们就可以非常快速的做完一个项目的 身份验证授权,功能了。并且可以使用自定义的realm去自己实现身份认证、授权的过程。

ok,本章到此完结,想要继续学习shiro的小伙伴。可以持续关注我之后的文章。

有什么问题可以在评论区指出。谢谢!!!

参考:
w3cschool shiro教程
shiro官网

相关文章: