如果你正在构建一个前后端分离项目,可以看一看下面这篇文章
前后端分离中SpringBoot优雅的整合Shiro+Jwt实现无状态认证(流程分析与代码实现)
Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有Spring Security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了
Shiro可以做什么?
其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与Web 集成、缓存等。
Apache Shiro 的目标是Shiro开发团队所说“应用程序安全的四大基石”——身份验证、授权、会话管理和密码学
- 身份验证:有时也称为“登录”,这是证明用户就是他们所说的身份的行为。
- 授权:访问控制的过程,即确定“谁”可以访问“什么”。
- 会话管理:管理特定于用户的会话,即使是在非 Web 或 EJB 应用程序中。
- 密码学:使用密码算法确保数据安全,同时仍然易于使用。
文章目录
Shiro的架构
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。这不就是我们想要的嘛,而且 Shiro 的 API 也是非常简单;其基本功能点如下图所示
记住一点,Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。
接下来我们分别从外部和内部来看看 Shiro 的架构
首先,我们从外部来看 Shiro 吧,即从应用程序角度的来观察如何使用 Shiro 完成工作
外部架构
Shiro从外部来看—>记住这三个对象代表的含义
应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject
其每个 API 的含义:
Subject
:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
SecurityManager
:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;相当于 SpringMVC 中的 DispatcherServlet 或者 Struts2 中的 FilterDispatcher;是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理。
Realm
:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源
内部架构
也就是说对于我们而言,最简单的一个 Shiro 应用
- 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
- 我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。
从以上也可以看出,Shiro 不提供维护用户 / 权限,而是通过 Realm 让开发人员自己注入
接下来我希望可以通过一个官方给出的例子,源自《10 Minute Tutorial on Apache Shiro》,借此来快速上手shiro
但是你也可以根据需要直接看Springboot整合Shiro
快速入门
环境搭建
Shiro可以在任何环境下运行,小到最简单的命令行应用,大到大型的企业应用以及集群应用。我们使用最简单的 main 方法的方式(参考自官网文档),让你对 Shiro的API有个感官的认识
public static void main(String[] args) { //shiro的入门代码 }
在开始之前,请保证已经熟悉以下几点
- Maven的基本操作
- Java基础与运行环境
Idea新建一个普通Maven工程,然后我们删除Src文件夹,在该project下新建一个module,起名为quickstart(这样做的目的是可以使用一个工程管理多个模块,在多模块项目中,父项目充当基础Maven配置的容器)
目录结构如下图
官方的QuickStart
案例托管在Github
,如下图
🍨 并且samples目录下有很多shiro在其他环境下应用的案例!(值得你去看看)
我们将通过QuickStart.java
这个类来学习Shiro的基本操作,在此之前,我们需要准备这个类运行所依赖的环境和依赖包
然后开始准备环境
在pom.xml导入Maven依赖,
log4j
与shiro-core
在Resources目录下,补充上面两个中间件的配置文件
用户名 / 密码硬编码在
ini
配置文件,以后需要改成如数据库存储,且密码需要加密存储
具体操作如下
首先在quickstart模块的pom.xml
文件中导入以下依赖
(关于版本号的问题,如果你离该博客更新时间较远,可以去maven仓库自行选择版本)
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.8.0</version>
</dependency>
<!-- configure logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
分别编写log4j
和Shiro
的配置文件,添加这两个文件到resource目录下
log4j.xml
注:Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties属性文件
<Configuration name="ConfigTest" status="ERROR" monitorInterval="5">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.springframework" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.apache" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="net.sf.ehcache" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.apache.shiro.util.ThreadContext" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>