springboot第19集:权限

  • 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.mfbz.cn/a/18312.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 EKS Fargate 搭建微服务性能分析系统

背景 近期 Amazon Fargate 在中国区正式落地&#xff0c;因 Fargate 使用 Serverless 架构&#xff0c;更加适合对性能要求不敏感的服务使用&#xff0c;Pyroscope 是一款基于 Golang 开发的应用程序性能分析工具&#xff0c;Pyroscope 的服务端为无状态服务且性能要求不敏感&…

部署simple-chat项目

simple-chat介绍&#xff1a;此项目是基于openAI3.5模型的h5端人工智能聊天项目&#xff0c;无需翻墙即可体验。 simple-chat线上地址&#xff1a;simple-chat simple-chat项目地址&#xff1a;GitHub - AMxiaoming/simple-chat nginx部署前端步骤&#xff1a; https://blo…

MySQL基础(十八)MySQL8其它新特性

1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本&#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&#xff0c;开发者对MySQL的源代码进行了重构&#xff0c;最突出的一点是MySQL Optimizer优化器进行了改进。不仅在速度上得…

HashSet和HashMap内部结构分析

首先明确一点&#xff1a;HashSet的底层就是HashMap HashSet与HashMap的不同点&#xff1a; HashMap存储的是键值对&#xff08;也就是key-value&#xff09;&#xff0c;即在调用HashMap的put方法时传入的两个值&#xff0c;而HashSet其实也是存储的键值对&#xff0c;但是键…

阿里云服务器镜像怎么选?操作系统版本选择说明

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云百科来详细说下阿里云服务器操作系统有哪些&#xf…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

从爆火的“哇呀挖”,思考我软件开发的人生意义何在?

【 在什么样的花园里面&#xff0c;挖呀挖呀挖&#xff0c;种什么样的种子&#xff0c;开什么样的花&#xff0c;在小小的花园里面&#xff0c;挖呀挖呀挖&#xff0c;种小小的种子&#xff0c;开小小的花&#xff0c;在大大的花园里面&#xff0c;挖呀挖呀挖&#xff0c;种大大…

国内GPU渲染农场有哪些值得推荐?

GPU凭借它在图形渲染领域强大的架构和计算能力&#xff0c;给广大用户带来了一种更为高效的解决方案&#xff0c;我们启用GPU渲染加速&#xff0c;实际就是调用GPU加速图形的渲染和填充。既然聊到GPU渲染&#xff0c;CG行业的朋友们肯定也好奇国内值得推荐的GPU渲染农场有哪些&…

​射频PCB 设计​的六大条技巧

即使是最自信的设计人员&#xff0c;对于射频电路也往往望而却步&#xff0c;因为它会带来巨大的设计挑战&#xff0c;并且需要专业的设计和分析工具。这里将为您介绍六条技巧&#xff0c;来帮助您简化任何射频PCB 设计任务和减轻工作压力&#xff01; 1、保持完好、精确的射频…

Android网络代理原理及实现

网络代理简介 代理典型的分为三种类型&#xff1a; 正向代理 缓存服务器使用的代理机制最早是放在客户端一侧的&#xff0c;是代理的原型&#xff0c;称为正向代理。其目的之一 是缓存&#xff0c;另一目的是用来实现防火墙&#xff08;阻止互联网与公司内网之间的包&#x…

第十二章_Redis单线程 VS 多线程

Redis为什么选择单线程&#xff1f; 是什么 这种问法其实并不严谨&#xff0c;为啥这么说呢? Redis的版本很多3.x、4.x、6.x&#xff0c;版本不同架构也是不同的&#xff0c;不限定版本问是否单线程也不太严谨。 1 版本3.x &#xff0c;最早版本&#xff0c;也就是大家口口相…

Day965.从持续集成到持续部署 -遗留系统现代化实战

从持续集成到持续部署 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于从持续集成到持续部署的内容。 只有做好任务分解和小步提交&#xff0c;才能放心大胆地 PUSH 代码&#xff0c;触发持续构建&#xff1b; 只有通过质量门禁&#xff0c;才能得到一个有信心的制…

( 位运算 ) 268. 丢失的数字 ——【Leetcode每日一题】

❓268. 丢失的数字 难度&#xff1a;简单 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; 输入&#xff1a;nums [3,0,1] 输出&#xff1a;2 解释&#xff1a;n 3&#xff0c;因为有 3 个数…

干货分享|一款让企业知识管理变得简单高效的工具软件

互联网发展到下半场&#xff0c;很多企业都开始进行数字化转型&#xff0c;在这个过程中&#xff0c;很多企业都忽视了极为重要的一点——企业的知识管理。如今信息化的时代&#xff0c;可以说企业的知识管理是引领企业数字化转型、进行创新的关键。 企业知识管理的实质就是对…

视频文本检索之CLIP4Clip

论文&#xff1a;CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval GitHub&#xff1a;https://github.com/ArrowLuo/CLIP4Clip 学习是一种行动反射&#xff0c; 不是为了晓得些“知识”&#xff0c; 要切己体察&#xff0c;代入自己&#xff0c…

mid360激光雷达跑Point-LIO算法

在商场里面上下楼穿梭,使用mid360激光雷达,完成建图 以下是建图的运行过程及参数配置 mid360激光雷达驱动 安装(ubuntu20.4 ) /ws_livox/src/livox_ros_driver2$source /opt/ros/noetic/setup.sh /ws_livox/src/livox_ros_driver2$./build.sh ROS1配置修改MID360_confi…

可拓展哈希

可拓展哈希 借CMU 15445的ppt截图来说明问题。 我们传统静态hash的过程是hash函数后直接将值存入对应的bucket&#xff0c;但是在可扩展hash中&#xff0c;得查询Directory&#xff08;左&#xff09;&#xff0c;存入directory指向的bucket&#xff08;右&#xff09;。 下面…

ASEMI代理ADI亚德诺LTC6992IS6-1#TRMPBF车规级芯片

编辑-Z LTC6992IS6-1#TRMPBF参数描述&#xff1a; 型号&#xff1a;LTC6992IS6-1#TRMPBF 输出频率&#xff1a;3.81Hz 工作电源电压范围&#xff1a;2.25 - 5.5V 通电复位电压&#xff1a;1.95V 电源电流&#xff1a;105-365A SET引脚处的电压&#xff1a;1V 频率设置电…

物联网|IAR集成开发环境简介|cc254核心板硬件资源|物联网之蓝牙4.0 BLE基础-学习笔记(3)

文章目录 4、IAR集成开发环境简介5、 cc254核心板硬件资源 4、IAR集成开发环境简介 完整稳定的专业嵌入式开发环境&#xff0c;对不同的处理器有统一的用户界面&#xff0c;支持35种以上的MCU&#xff0c;包括8&#xff0c;16&#xff0c;32位&#xff0c; 完全兼容C语言的 高…

FPN和PAN的内容及区别

FPN和PAN都是用于解决在目标检测中特征金字塔网络(FPN)在多尺度检测任务上的不足的方法。下面分别详细介绍一下它们的原理和区别。 FPN FPN全称Feature Pyramid Network&#xff0c;是由FAIR在2017年提出的一种处理多尺度问题的方法。FPN的主要思路是通过构建金字塔式的特征图…
最新文章