【SpringBoot+Shiro 用户认证授权权限项目总结】环境搭建、数据库、项目代码、功能测试截图

前言:本文项目学习自 https://www.bilibili.com/video/BV11e4y1n7BH?p=12,下面为笔记总结

1 环境搭建

项目结构

在这里插入图片描述

添加依赖

<dependencies>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.9.0</version>
    </dependency>

    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>

    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <!--配置Thymeleaf与Shrio的整合依赖-->
    <dependency>
        <groupId>com.github.theborakompanioni</groupId>
        <artifactId>thymeleaf-extras-shiro</artifactId>
        <version>2.0.0</version>
    </dependency>

    <!--Shiro整合EhCache-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-ehcache</artifactId>
        <version>1.4.2</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

</dependencies>

添加 yml 配置

在这里插入图片描述

2 数据库表

role 表

在这里插入图片描述

role_user 表

在这里插入图片描述
user 表

在这里插入图片描述

3 项目代码

Entity

在这里插入图片描述

Mapper

在这里插入图片描述

Service

在这里插入图片描述
在这里插入图片描述

自定义的 Relam

在这里插入图片描述
在这里插入图片描述

配置类 Config

设置 SecurityManager,并装入自定义的 Realm、rememberMe、缓存管理器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

缓存管理器的参数配置在了 xml 中

在这里插入图片描述

补充:配置多 Realm

配置多 Realm,首先要实现多个 Realm,在配置类中将这些 Realm 注入,并在 SecurityManager 中指定策略、装入这些 Realm 的集合即可

在这里插入图片描述
当应用程序配置多个 Realm 时,例如:用户名密码校验、手机号验证码校验等等。
Shiro 的 ModularRealmAuthenticator 会使用内部的 AuthenticationStrategy 组件判断认证是成功还是失败。

AuthenticationStrategy 是一个无状态的组件,它在身份验证尝试中被询问 4 次(这4 次交互所需的任何必要的状态将被作为方法参数):
(1)在所有 Realm 被调用之前
(2)在调用 Realm 的 getAuthenticationInfo 方法之前
(3)在调用 Realm 的 getAuthenticationInfo 方法之后
(4)在所有 Realm 被调用之后
认证策略的另外一项工作就是聚合所有 Realm 的结果信息封装至一个
AuthenticationInfo 实例中,并将此信息返回,以此作为 Subject 的身份信息。
Shiro 中定义了 3 种认证策略的实现,ModularRealmAuthenticator 内置的认证策略默认实现是AtLeastOneSuccessfulStrategy 方式。可以通过配置修改策略
在这里插入图片描述

Controller

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义异常

在这里插入图片描述

前端测试页

在这里插入图片描述
在这里插入图片描述

4 测试

测试:登录功能

输入完信息后,点击登录

在这里插入图片描述

可以看到后端已经来到对应接口

在这里插入图片描述

先是来到了我们的登录认证方法 doGetAuthenticationInfo

在这里插入图片描述

之后来到了我们自定义的 Realm 的授权方法 doGetAuthorizationInfo

在这里插入图片描述

并在授权方法这里获取角色、权限

在这里插入图片描述

成功来到了首页

在这里插入图片描述

测试:RememberMe 功能

若登录时没有勾选记住我,那么后台也不会走 RememberMe 的逻辑,不会存入 Cookies 中用户信息,我们访问一个需要认证登录的页面,则直接跳转到登录页面

在这里插入图片描述
在这里插入图片描述

另外如果我们不勾选记住我,那么自然也不会有对应的 Cookies

在这里插入图片描述

我们试着勾选记住我

在这里插入图片描述

测试:登出功能

点击登出后,对应的 Cookies 也被清除了

在这里插入图片描述

测试:角色、权限功能

前端页面使用 shiro-thymeleaf 模板,进行角色或权限的个性化功能展示

在这里插入图片描述

后台也要做好校验,直接用注解即可

在这里插入图片描述

加入 李四 登录,在之前数据表中我们的测试数据是李四没有这些权限,并且是用户角色,因此前端不会显示,后台接口之间访问也会阻止

在这里插入图片描述

在这里插入图片描述

而张三我们的数据中设定的是他有这两种权限以及admin管理员角色,下面测试便可以展示

在这里插入图片描述
在这里插入图片描述

测试:ehcache缓存

在 ShiroConfig 中先注释掉缓存管理器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们走一条有角色校验的请求,多走几次发现,每走一次后台都会打印 dao 层的日志,可见每次都需要去数据库查一次

在这里插入图片描述

接下来我们把之前的注释去掉,开启缓存管理器,我们还是访问上面的请求,发现并不会再查一次数据库,那么缓存便配置成功了

在这里插入图片描述

5 知识点

常用注解

(1)@RequiresAuthentication
验证用户是否登录,等同于方法subject.isAuthenticated()

(2)@RequiresUser
验证用户是否被记忆:
登录认证成功subject.isAuthenticated()为true
登录后被记忆subject.isRemembered()为true

(3)@RequiresGuest
验证是否是一个guest的请求,是否是游客的请求
此时subject.getPrincipal()为null

(4)@RequiresRoles
验证subject是否有相应角色,有角色访问方法,没有则会抛出异常
AuthorizationException。
例如:@RequiresRoles(“aRoleName”)
void someMethod();
只有subject有aRoleName角色才能访问方法someMethod()

(5)@RequiresPermissions
验证subject是否有相应权限,有权限访问方法,没有则会抛出异常
AuthorizationException。
例如:@RequiresPermissions (“file:read”,”wite:aFile.txt”)
void someMethod();
subject必须同时含有file:read和wite:aFile.txt权限才能访问方法someMethod()

会话管理 SessionManager

会话管理器,负责创建和管理用户的会话(Session)生命周期,它能够在任何环境中在本地管理用户会话,即使没有Web/Servlet/EJB容器,也一样可以保存会话。默认情况下,Shiro会检测当前环境中现有的会话机制(比如Servlet容器)进行适配,如果没有(比如独立应用程序或者非Web环境),它将会使用内置的企业会话管理器来提供相应的会话管理服务,其中还涉及一个名为SessionDAO的对象。SessionDAO负责Session的持久化操作(CRUD),允许Session数据写入到后端持久化数据库

SessionManager由SecurityManager管理。Shiro提供了三种实现

(1) DefaultSessionManager:用于JavaSE环境

(2) ServletContainerSessionManager:用于web环境,直接使用Servlet容器的会话

(3) DefaultWebSessionManager:用于web环境,自己维护会话(不使用Servlet容器的
会话管理)

编码
Session session = SecurityUtils.getSubject().getSession();
session.setAttribute(“key”,”value”)

说明

  • Controller 中的 request,在 shiro 过滤器中的 doFilerInternal 方法,被包装成
    ShiroHttpServletRequest。

  • SecurityManager 和 SessionManager 会话管理器决定 session 来源于 ServletRequest还是由 Shiro 管理的会话。

  • 无论是通过 request.getSession 或 subject.getSession 获取到 session,操作
    session,两者都是等价的。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很抱歉,由于篇幅和涉及版权等问题,无法提供完整的代码实现。以下是基于springboot+shiro+layui实现qq聊天室功能的代码结构和主要实现思路供参考: 1. 后端代码结构 - controller:控制层,实现用户登录、注册等接口。 - service:服务层,实现用户管理、聊天消息管理等业务逻辑。 - dao:数据访问层,实现对数据库的增删改查操作。 - entity:实体类,包括用户信息、聊天消息等。 - config:配置类,实现Shiro安全框架的配置。 - websocket:WebSocket实现,接收消息并广播给在线用户。 2. 前端代码结构 - index.html:聊天室主页面。 - login.html:用户登录页面。 - register.html:用户注册页面。 - layui:Layui框架相关文件。 - js:前端JS代码,实现聊天室界面和逻辑。 3. 主要实现思路 - 用户登录:前端发送用户名和密码到后台,后台进行密码验证并返回登录结果。 - 用户注册:前端发送用户名和密码到后台,后台将用户信息保存到数据库中。 - 聊天室界面:前端使用Layui实现聊天室界面,包括聊天消息显示和发送消息等功能。 - 实时通讯:使用WebSocket实现前后端实时通讯功能,后端接收消息并将消息广播给所有在线用户,前端接收消息并显示在聊天室界面中。 - 私聊功能:在聊天室界面中添加私聊功能,用户可以选择一个在线用户进行私聊,后端接收私聊消息并发送给对应的用户。 - 数据库存储:使用MySQL作为持久化存储,将用户信息、聊天记录等数据保存到数据库中。 以上是springboot+shiro+layui实现qq聊天室功能的主要实现思路和代码结构,具体实现过程需要根据实际需求进行调整和改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超周到的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值