快速上手Shiro—Java认证和授权框架

如果你正在构建一个前后端分离项目,可以看一看下面这篇文章
前后端分离中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 也是非常简单;其基本功能点如下图所示

image-20211010164107799.png

记住一点,Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。

接下来我们分别从外部和内部来看看 Shiro 的架构

首先,我们从外部来看 Shiro 吧,即从应用程序角度的来观察如何使用 Shiro 完成工作

外部架构

Shiro从外部来看—>记住这三个对象代表的含义

image-20211011122912457

应用代码直接交互的对象是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,即安全数据源

内部架构

image-20220318230428041

也就是说对于我们而言,最简单的一个 Shiro 应用

  1. 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
  2. 我们需要给 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配置的容器)

目录结构如下图

image-20220318124131862

官方的QuickStart案例托管在Github,如下图

🍨 并且samples目录下有很多shiro在其他环境下应用的案例!(值得你去看看)

在这里插入图片描述

我们将通过QuickStart.java这个类来学习Shiro的基本操作,在此之前,我们需要准备这个类运行所依赖的环境和依赖包

然后开始准备环境

  1. 在pom.xml导入Maven依赖,log4jshiro-core

  2. 在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>

分别编写log4jShiro的配置文件,添加这两个文件到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>
        
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro框架是一个功能强大的Java安全框架,可以用于认证授权。下面是使用Shiro进行认证授权的基本步骤: 1. 添加Shiro依赖:在你的项目中添加Shiro的相关依赖,可以通过Maven或者Gradle进行引入。 2. 配置Shiro:创建一个Shiro的配置文件(通常是一个ini文件),配置Shiro的一些基本信息,例如Realm、Session管理等。你可以根据你的需求进行配置。 3. 创建Realm:Realm是Shiro用来进行认证授权的核心组件。你需要实现一个自定义的Realm来实现用户的认证授权逻辑。在Realm中,你可以通过重写相应的方法来实现自定义的认证授权逻辑,例如验证用户名密码、查询用户角色和权限等。 4. 认证:在用户登录时,你可以通过调用Shiro提供的Subject.login方法来进行认证。该方法会将用户提交的用户名和密码传递给你自定义的Realm进行验证。如果验证通过,Shiro会将用户信息保存在Session中。 5. 授权:在用户进行操作时,你可以通过调用Shiro提供的Subject.hasRole和Subject.isPermitted方法来进行授权判断。这些方法会根据你在Realm中配置的角色和权限信息进行判断,决定用户是否具有相应的角色或权限。 以上是使用Shiro进行认证授权的基本步骤,你可以根据具体的需求进行定制和扩展。在实际应用中,你还可以通过Shiro提供的其他功能,如RememberMe、Session管理等来增强安全性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值