springboot第19集:权限

news2024/12/28 20:59:12
  • article 文章表

  • sys_permission 后台权限表

  • sys_role 后台角色表

  • sys_role_permission 角色-权限关联表

  • sys_user 用户表

  • sys_user_role 用户-角色关联表

3f9c171b7714d018141593d056c9d3b1.png
image.png
3a26f65e3d9c15e813b9138776208235.png
image.png

sys_user_role

id user_id(用户id) role_id(角色id)

sys_role

id role_name(角色名) create_time(创建时间)update_time(更新时间) delete_status(删除状态)

article

id content(varchar 255 文章内容) create_time(timestamp 创建时间) update_time(timestamp 更新时间) delete_status(varchar 是否有效,1有效,2无效)

13b1c19458b231cbadbe87de6622a3aa.png
image.png
03b62db92922877cdc74cdb1114fccae.png
image.png
d3612fd506f227bc76cf7b3da2ac9b0c.png
image.png

Spring框架中的@Configuration注解,表示这个类用于配置应用程序上下文。

实现了WebMvcConfigurer接口,这意味着该类将覆盖默认的Spring MVC配置,以便我们可以自定义Web应用程序的行为。

@Autowired注解用于自动装配loginHandler对象,这里的loginHandler是一个实现了Interceptor接口的拦截器实例。

在实现WebMvcConfigurer接口时,必须实现addInterceptors方法。此方法允许我们向注册表中添加自定义拦截器,以便它们能够拦截特定的请求并执行一些逻辑操作。

在addInterceptors方法内部,我们通过registry参数注册了一个loginHandler拦截器。这意味着每次发出HTTP请求时都会调用这个拦截器,并且该拦截器的逻辑将在请求被处理之前或之后执行。

@Configuration@EnableCaching 是Spring框架中的两个注解。

@Configuration 用于标注一个类,表示这个类是一个配置类。Spring容器在启动时,会扫描带有该注解的类,并根据其中的@Bean等注解创建相应的Bean对象。

@EnableCaching 标注在配置类上,表示开启缓存支持。使用该注解时,需要在配置类中配置缓存管理器(如RedisCacheManager)以及缓存的一些参数。如果不配置缓存管理器,则默认使用ConcurrentMapCacheManager。

当我们在Spring应用中需要使用缓存时,只需要添加相应的注解即可,例如:@Cacheable@CachePut@CacheEvict 等。

总之,@Configuration@EnableCaching 注解结合起来使用,可以方便地配置缓存管理器和缓存规则,并在需要缓存的方法上添加缓存注解,从而实现缓存功能。

一个配置类,用于配置默认的缓存管理器,并使用了Spring框架中的一些注解。

  • @Primary 注解用于指定在多个同类型的 Bean 中优先选择哪个 Bean。这里我们将默认的缓存管理器标记为首选项。

  • @Bean 注解用于告诉 Spring 容器,该方法返回的对象要注册为一个 Bean。在这里,我们将返回一个 CaffeineCacheManager 对象作为默认的缓存管理器,并且可以通过其 setCaffeine() 方法来设置一些缓存的属性。

  • 在 setCaffeine() 方法中,我们使用了Caffeine作为缓存实现,并进行了如下设置:

    • expireAfterWrite() 方法设置最后一次写入后经过固定时间过期。

    • initialCapacity() 方法设置初始的缓存空间大小。

    • maximumSize() 方法设置缓存的最大条数。

这样我们就配置好了一个使用 Caffeine 作为缓存实现的默认缓存管理器,其中缓存数据会在 10 秒后过期。当需要使用缓存时,只需要调用该缓存管理器即可。

使用Spring框架中的@Bean注解定义了一个名为"tokenCacheManager"的Bean,它返回了一个由Caffeine库构建的缓存对象。具体注解说明如下:

@Bean("tokenCacheManager"):表示该方法返回一个Bean对象,并将其命名为"tokenCacheManager"。

public Cache<String, SessionUserInfo> caffeineCache():该方法返回值为Caffeine缓存对象,并且该方法可以被其他组件引用,即可通过spring容器获取到这个对象。

return Caffeine.newBuilder():创建一个新的缓存构造器。

.expireAfterAccess(30L, TimeUnit.MINUTES):指定缓存条目在最后一次访问后,在固定时间(30分钟)之后过期。

.initialCapacity(100):设置缓存初始容量为100。

.maximumSize(10000):设置缓存最大容量为10000条数据。

.build():调用build()方法构建Caffeine缓存对象,该缓存对象是Spring框架管理的一个单例Bean,在应用程序运行期间只会创建一次,其他组件可以通过依赖注入的方式来使用它。

MyBatis是一个开源的Java持久层框架,它可以帮助我们简化数据库操作,同时提供了一些高级特性,如自定义SQL、存储过程和高级映射等。MyBatis使得Java程序员能够更加方便地访问关系数据库,并且在操作上比JDBC更加灵活。

MyBatis的主要特点是通过简单的XML或注解来配置和映射原始类型、接口和POJO为数据库中的记录。这使得我们可以将数据库表映射到Java对象,从而进一步简化数据库操作过程。同时,MyBatis还支持动态SQL,允许我们根据运行时条件生成不同的SQL语句,从而实现更加复杂的查询和更新操作。

除此之外,MyBatis还具有良好的性能和可扩展性。它采用了缓存机制,可以缓存SQL语句和查询结果,从而避免了频繁地访问数据库。同时,MyBatis也支持插件机制,允许我们在不修改源码的情况下增强其功能。

总之,MyBatis是一个功能强大且易于使用的Java持久层框架,旨在帮助Java程序员更轻松地访问关系数据库。

使用了@Transactional注解来表示这个方法需要在一个事务中执行,如果出现异常则会回滚事务。具体注解的含义如下:

@Transactional(rollbackFor = Exception.class)

  • @Transactional: 这是Spring框架提供的事务注解,用于表示该方法需要在一个事务中执行。

  • rollbackFor = Exception.class:表示当方法抛出任何异常时,都会让事务回滚。

public JSONObject addArticle(JSONObject jsonObject) {

  • public: 表示该方法可以被其他类调用。

  • JSONObject: 返回值类型为JSONObject对象。

  • addArticle: 方法名,用于添加文章到数据库。

  • (JSONObject jsonObject): 接受一个JSONObject对象作为参数,该对象包含了文章的相关信息。

articleDao.addArticle(jsonObject);

  • articleDao:数据访问对象,通过它来操作数据库。

  • addArticle(jsonObject):调用articleDao对象的addArticle方法添加文章到数据库,传入方法的参数为JSONObject对象。

return CommonUtil.successJson();

  • return: 返回操作结果,这里返回了一个成功的JSONObject对象。

  • CommonUtil:工具类,封装了一些常用的方法。

  • successJson(): 静态方法,返回一个表示操作成功的JSONObject对象。

实现基于 Token 令牌的 Web 应用安全访问控制可以通过以下几个步骤实现:

  1. 生成 Token:Token 可以由服务器生成,也可以由第三方认证服务提供商生成。在生成 Token 时,需要考虑 Token 的有效期、加密方式等因素。

  2. 发送 Token:一旦生成了 Token,服务器需要将它发送给客户端。通常情况下,Token 在 HTTP 请求头中发送,例如 Authorization 头部中包含 Bearer Token。

  3. 验证 Token:服务器在接收到请求时,需要从请求头中获取 Token,并对其进行验证。验证 Token 的过程通常涉及到解密、解析、校验有效期等步骤。

  4. 授权访问:如果 Token 验证通过,服务器会对请求进行授权访问。通常情况下,服务器会将用户的权限信息存储在 Token 中,在进行授权访问时,需要先解析出用户的权限信息,然后再进行访问控制。

实现纯 Token 认证的 Web 应用时,可以通过关闭 Spring Security 自带的 Session、允许跨域请求,并增加一个 Token 拦截器来拦截所有请求并验证 Token 令牌是否有效。具体实现可参考以下步骤:

  1. 关闭 Spring Security 自带的 Session:在 SecurityConfig 类中,可以通过 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 的方式关闭 Session。

  2. 允许跨域请求:在 SecurityConfig 类中,可以通过 .cors() 的方式允许跨域请求。

  3. 增加 Token 拦截器:创建一个 TokenInterceptor 类,实现 HandlerInterceptor 接口,并在 preHandle 方法中对 Token 进行验证。如果 Token 验证失败,可以返回错误信息或者直接拒绝请求。

  4. 注册 Token 拦截器:在 WebMvcConfigurer 中注册 TokenInterceptor,使其生效。

如果想要实现 Session + Token 认证的 Web 应用,可以增加 Session、Token 拦截器来拦截所有请求,并根据请求是否带 Cookie 进行不同的认证授权。具体实现可参考以下步骤:

  1. 创建 SessionInterceptor 类和 TokenInterceptor 类,并实现 HandlerInterceptor 接口。在 preHandle 方法中,分别对 Session 和 Token 进行验证。

  2. 在 SecurityConfig 类中,关闭 Spring Security 自带的 Session,并增加一个 RememberMeConfigurer,将 Session ID 存储在 Cookie 中。

  3. 注册 SessionInterceptor 和 TokenInterceptor,使其生效。

  4. 在 TokenInterceptor 中,判断请求是否带有 Cookie。如果带有 Cookie,则使用 Session 进行认证授权,否则使用 Token 进行认证授权。

需要注意的是,虽然 Token 令牌不保存用户的认证信息,但是 Token 仍然需要进行加密处理以保证安全性。另外,在 Token 令牌的有效期到期之前,服务器需要定期更新 Token。

HTTP 协议本身是无状态的,也就是说服务器并不知道用户是否已经登录。为了解决这个问题,通常有以下两种方法:

  1. 基于 Session 的身份验证

在基于 Session 的身份验证中,当用户第一次登录成功后,服务器会创建一个对应该用户的 Session,并将 Session ID 返回给客户端。客户端每次请求时需要带上该 Session ID,服务器通过验证 Session ID 来确定用户是否已经登录。

具体实现方式是:用户第一次登录成功后,服务器会生成一个唯一的 Session ID,并将该 ID 存储在某个地方(例如内存、数据库等)和客户端的 Cookie 中。当客户端再次请求时,会带上存储在 Cookie 中的 Session ID,服务器通过验证该 Session ID 来确定用户是否已经登录。如果 Session ID 有效,则认为用户已经登录;否则,认为用户未登录。

优点:相对简单易用,适合小型项目。

缺点:需要在服务器端保存 Session ID,占用一定的内存资源;同时,如果用户量较大,会导致服务器的性能瓶颈。

  1. 基于 Token 的身份验证

在基于 Token 的身份验证中,当用户第一次登录成功后,服务器会生成一个 Token,并将该 Token 返回给客户端,客户端每次请求时需要带上该 Token,服务器通过验证 Token 来确定用户是否已经登录。

具体实现方式是:用户第一次登录成功后,服务器会生成一个唯一的 Token,并将该 Token 存储在某个地方(例如 Redis、数据库等)和客户端的 Cookie 或者请求头中。当客户端再次请求时,会带上存储在 Cookie 或者请求头中的 Token,服务器通过验证该 Token 来确定用户是否已经登录。如果 Token 有效,则认为用户已经登录;否则,认为用户未登录。

优点:相对于 Session,不需要在服务器端保存状态信息,极大降低了服务器的压力,适合分布式系统。

缺点:实现相对复杂,需要考虑 Token 的安全性和有效期等问题。

总之,选择使用哪种身份验证方式取决于具体项目的需求和场景。如果是小型项目,可以选择基于 Session 的身份验证方式;如果是大型项目或者分布式系统,可以选择基于 Token 的身份验证方式。

基于 Session 的认证方法是一种常用的用户身份验证方式,其主要流程如下:

  1. 用户登录:用户在客户端输入用户名和密码进行登录。

  2. 服务端生成 Session:服务器在接收到用户登录请求后,会为该用户生成一个 Session,并将 Session ID 返回给客户端。通常情况下,Session ID 会被存储在 Cookie 中。

  3. 客户端发送请求:客户端每次向服务器发送请求时,都会带上存储在 Cookie 中的 Session ID。

  4. 服务端验证 Session:服务器在接收到请求后,会根据 Session ID 去查找相应的 Session。如果能够找到对应的 Session,就说明用户已经通过了身份验证,可以继续执行后续操作;否则,就需要提示用户重新登录或者返回错误信息。

  5. Session 管理:在用户退出登录或者一段时间不活跃之后,服务器需要及时销毁对应的 Session,释放资源。

需要注意的是,在分布式系统中,基于 Session 的认证方法需要考虑跨服务的问题。通常情况下,可以将 Session 存储在共享缓存(例如 Redis)中,以实现多个服务之间的 Session 共享。同时,为了保证安全性,还需要对 Session 进行加密处理,防止被恶意攻击者盗取或者篡改。

另外,基于 Session 的认证方法还有一些可拓展的方式,例如使用 JWT(JSON Web Token)替代 Session、使用 Spring Security 等第三方库来简化身份验证流程等。不同的拓展方式有着不同的适用场景和优缺点,需要根据具体项目需求进行选择。

基于 Token 的认证方法是一种不依赖于服务端 Session 的身份验证方式,其主要流程如下:

  1. 用户登录:用户在客户端输入用户名和密码进行登录。

  2. 生成 Token:服务器在接收到用户登录请求后,会根据一定的加密算法和密钥对用户信息进行加密处理,生成一个 Token,并将 Token 返回给客户端。

  3. 客户端保存 Token:客户端在接收到服务器返回的 Token 后,会将其保存起来,通常情况下,Token 会被存储在客户端的 localStorage 或者 sessionStorage 中,并在每次向服务器发送请求时带上该 Token。

  4. 服务端验证 Token:服务器在接收到请求后,会根据预先设定的密钥对 Token 进行解密,并校验 Token 的有效性。如果 Token 有效,则说明用户已经通过了身份验证,可以继续执行后续操作;否则,就需要提示用户重新登录或者返回错误信息。

  5. Token 管理:在用户退出登录或者一段时间不活跃之后,服务器需要及时销毁对应的 Token,以保护用户的安全。

需要注意的是,在实现基于 Token 的认证方法时,需要考虑 Token 的安全性和有效期问题。为了保证安全性,通常会使用一些加密算法(例如 HMAC、RSA)对 Token 进行加密处理,从而防止 Token 被恶意攻击者盗取或者篡改。同时,为了防止 Token 被长时间滥用,还需要设置 Token 的有效期,并定期更新 Token。

另外,基于 Token 的认证方法还有一些可拓展的方式,例如使用 JWT(JSON Web Token)、OAuth 2.0 等开放标准协议来实现认证授权等。不同的拓展方式有着不同的适用场景和优缺点,需要根据具体项目需求进行选择。

验证码生成流程:前端发起验证码请求,后端程序生成验证码,将当前验证码信息保存到session并设置过期时间,返回前端base64编程等格式数据,前端处理验证码显示

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

决策树生成剪枝算法原理

决策树生成算法 首先明确信息熵 信息增益的概念 信息增益表示得知特征X信息是的类Y的信息不确定性减少的程度 H(D) 经验熵表示对数据D进行分类的不确定性 H(D|A)经验条件熵表示对特征A给定条件下对数据集D进行分类的不确定性&#xff08;显然这个值越小越好 那么g(D,A)信息…

基于粒子群优化的中文文本分类

基本思路&#xff1a; 方法&#xff1a;使用优化算法&#xff08;如粒子群&#xff09;优化支持向量机SVM&#xff1b; 本文所使用的应用背景&#xff1a;中文文本分类&#xff08;同时可以应用到其他背景领域&#xff0c;如&#xff09; 应用背景&#xff08;元启发式算法优…

(学习日记)2023.5.9

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

QTableview常用几种代理总结

QTableview常用几种代理总结 [1] QTableview常用几种代理总结1、QCheckBox和QRadioButton的嵌入2、QHeadView中嵌入QCheckBox类3、QCombobox的嵌入4、 QCombox QCheckBox类5、SpinBox的嵌入类6、QProcess的嵌入类7、QProcess绘制版本的嵌入类8、QPushButton/QLabel/QImage的嵌…

鸿蒙Hi3861学习八-Huawei LiteOS-M(事件标记)

一、简介 事件是一种实现任务间通信的机制&#xff0c;可用于实现任务间的同步。但事件通信只能是事件类型的通信&#xff0c;无数据传输。一个任务可以等待多个事件的发生&#xff1a;可以是任意一个事件发生时唤醒任务进行事件处理&#xff1b;也可以是几个事件都发生后才唤醒…

mongodb副本集搭建

1.本次搭建使用三台centos7主机搭建集群&#xff0c;关闭防火墙和selinux服务 2.主机信息如下图所示 主机名称IPPortServiceA10.1.60.11427017mongodbB10.1.60.11527017mongodbC10.1.60.11827017mongodb 3.从官网下载mongodb安装包(我这里下载的是6.0.5版本的tgz包) Instal…

小家电LED显示驱动多功能语音芯片IC方案 WT2003H4 B002

随着时代的进步&#xff0c;智能家电的普及已经成为了一个趋势。而在智能家电中&#xff0c;LED显示屏也成为了不可或缺的一部分。因此&#xff0c;在小家电的设计中&#xff0c;LED显示驱动芯片的应用也越来越广泛。比如&#xff1a;电饭煲、电磁炉、数字时钟、咖啡机、电磁炉…

【Vue3】如何创建Vue3项目及组合式API

文章目录 前言 一、如何创建vue3项目&#xff1f; ①使用 vue-cli 创建 ②使用可视化ui创建 ③npm init vite-app ④npm init vuelatest 二、 API 风格 2.1 选项式 API (Options API) 2.2 组合式 API (Composition API) 总结 前言 例如&#xff1a;随着前端领域的不断发展&am…

【SSM框架】SpringMVC 中常见的注解和用法

SSM框架 SpringMVC 中常见的注解和用法基础注解介绍RequestMapping 注解介绍PostMapping 和 GetMapping 注解介绍 获取参数相关注解的介绍只通过 RequestMapping 来获取参数只传递一个参数传递对象参数传递多个参数(非对象) RequestParam 后端参数重命名required 必传参数的设置…

SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)

场景 SpringBoot搭建的项目需要对开放的接口进行防刷限制&#xff0c;不同接口指定多少秒内可以请求指定次数。 比如下方限制接口一秒内最多请求一次。 注&#xff1a; 博客&#xff1a;霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主 实现 1、实现思路 首…

flink学习37:DataStream/DataSet与Table的互相转换

DataStream/DataSet转换成视图 DataStream/DataSet转换成表 表转换成DataStream/DataSet 表转换为DataStream/DataSet时&#xff0c;需要指定字段数据类型&#xff0c;最方便的就是把数据类型定为row&#xff0c;即行数据。 两种模式&#xff1a; 把表转为dataStream 把表转为d…

100ASK-V853-PRO编译烧写

100ASK_V853-PRO 环境配置及编译烧写 0.前言 本章主要介绍关于100ASK_V853-PRO开发板的Tina SDK包的下载和编译打包生成镜像&#xff0c;并将镜像烧录到100ASK_V853-PRO开发板上。在进行100ASK_V853-PRO开发板的环境配置前需要获取配置虚拟机系统&#xff0c;可以参考&#x…

【C语言督学训练营 第十二天】三篇文章吃透数据结构中的线性表(三)----- 线性表考研真题

文章目录 前言题目描述题目分析代码实战 前言 本篇博客从头到尾都在解析一道2019年考研真题中的一道关于链表的大题&#xff0c;虽然题目没有竞赛算法题那么复杂&#xff0c;那么难想&#xff0c;但是我们依旧可以从中收获到好多知识&#xff0c;本题的突破点就是快慢指针与链…

AP5153 线性降压恒流驱动芯片 2.5A

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路&#xff0c; 调节该外接电阻就可以调节 输出电流&#xff0c;输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…

echarts x轴与y轴 刻度 数据设置

xAxis: {nameTextStyle: {fontWeight: "bold",fontSize: "20",align: "left",},splitLine: {show: false,},axisLine: {show: true,symbol: ["none", "arrow"], //加箭头处symbolOffset: 0,lineStyle: {color: "rgb(12…

aardio的优缺点,强烈推荐大家试用一下,可以用它在windows下面写一些小工具

概述 官网 aardio是一种用于Windows平台的脚本编程语言&#xff0c;以及一个功能丰富的集成开发环境&#xff08;IDE&#xff09;。它结合了强大的原生Windows API访问能力和简单易学的语法。以下是aardio的一些优缺点。 优点&#xff1a; 简单易学&#xff1a;aardio的语法简…

Linux | 本地Yum源 | 网络Yum源(阿里云Yum源)

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 本地Yum源配置 创建挂载点目录 [rootlocalhost ~]# mkdir /mnt/cdrom [rootlocalhost ~]# df /mnt/cdrom/ 文件系统 1K-块 已用 可用 已用%…

慎入坑:腾讯云轻量2核2G3M服务器30元不建议选择

腾讯云轻量应用服务器2核2G3M带宽30元3个月不建议买&#xff0c;自带3M带宽&#xff0c;下载速度可达384KB/秒&#xff0c;100%CPU性能&#xff0c;系统盘为40GB SSD盘&#xff0c;200GB月流量&#xff0c;折合每天6.6G流量&#xff0c;地域节点可选上海/广州/北京&#xff0c;…

React Router 6 函数式组件withRouter 路由属性配置

withRouter为解决开发过程中函数组件路由参数获取问题&#xff0c;之前版本的withRouter是直接可以导入使用的&#xff0c;现在的需要手写 这里使用了hooks&#xff0c;获取路由、参数等相关信息 需要在函数式组件内使用props&#xff0c;用法&#xff1a; 1.需要先使用高阶组…

K8s常见面试题20问

K8s常见面试题19问 收集了一些K8s常见问题和同学们面试常被问到的问题. 如果有新的面试题私聊或者留言给我 1. Docker和虚拟机有那些不同 虚拟化环境下每个 VM 是一台完整的计算机&#xff0c;在虚拟化硬件之上运行所有组件&#xff0c;包括其自己的操作系统。 容器之间可以共…