Redis基础
-
概述
Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。
主要特点:
-
基于内存存储,读写性能高
-
适合存储热点数据(热点商品、资讯、新闻)
-
企业应用广泛
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。
NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。
-
Redis数据类型及命令
-
概述
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
-
字符串 string
-
哈希 hash
-
列表 list
-
无序集合 set
-
有序集合 zset
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令
-
Spring Data Redis
-
Redis常见的客户端
前面我们讲解了Redis的常用命令,这些命令是我们操作Redis的基础,那么我们在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。
Redis 的 Java 客户端很多,常用的几种:
-
Jedis
-
Lettuce
-
Spring Data Redis
Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,封装了 Jedis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。使用起来非常快速和简单。
我们重点学习Spring Data Redis。
-
概述
Spring Data Redis 是 Spring 的一部分,在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。
Spring Data Redis中提供了一个高度封装的类:Redis**Template**,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
-
ValueOperations:string数据操作
-
SetOperations:set类型数据操作
-
ZSetOperations:zset类型数据操作
-
HashOperations:hash类型的数据操作
-
ListOperations:list类型的数据操作
-
RBAC权限模型
-
概述
在企业系统中,通过配置用户的功能权限可以实现让不同的人分管不同业务的需求。基于RBAC模型,RBAC(Role Based Access Control)模型,它的中文是基于角色的访问控制,主要是将功能组合成角色,再将角色分配给用户,也就是说角色是功能的合集。
基于RBAC授权模式后,我们可以达成以下2个目标:
-
解耦用户和功能,降低操作错误率
-
降低功能权限分配的繁琐程度
-
Spring Security
-
概述
Spring Security是一个基于Spring框架的安全性解决方案,它为应用程序提供了完整的安全管理功能,包括认证、授权、攻击防范和会话管理等
-
核心作用
-
用户登录
-
校验验证码是否正确
-
通过spring security框架验证用户是否存在,密码是否正确
-
查询用户所拥有的权限列表
-
最后把用户信息封装到jwt生成的token中返回
-
-
其他请求(可以是非登录的任意请求),这些校验工作可以全部交给spring security来完成
-
url是否需要检验(访问接口是否需要放行,比如登录、注册、验证码这些接口;还有一些静态资源也需要放行,比如html、js、css等)
-
token校验,是否为空,是否过期,是否正常解析
-
校验当前访问的url与当前用户的权限是否匹配,匹配则放行,不匹配则是权限不
-
-
权限控制
-
认证
认证(Authentication)
认证是用户登录系统时,通过比较用户提供的凭证(如用户名和密码)与系统中存储的信息是否一致,以验证用户身份真实有效的过程
-
授权
授权(Authorization):
-
授权就是用户登录后(认证后),控制用户是否有权限访问某些资源。
-
下图是给用户赋予角色,并且可以可以赋予多个角色
-
权限验证
一个请求过来之后,需要有诸多的校验来能判断是否能有效访问
-
请求来了以后,比如是
doc.html
或login
,是一个静态资源,可直接放行,在SecurityConfig可以配置放行 -
请求来了以后,比如是
/nursing/elder/save
,在SecurityConfig没有配置放行,需要校验当前请求携带的token是否有效,如果token无效,则是认证失败,需要重新认证(跳转到登录页) -
请求来了以后,比如是
/nursing/elder/save
,在SecurityConfig没有配置放行,token也有效,则判断当前登录人是否拥有该权限(认证成功后,可以获取用户的权限列表)-
如果有权限,则放行
-
如果没权限,则提醒权限不足
-
具体的url检验是通过Spring Security的提供的权限注解@PreAuthorize
实现的,可以判断具体的url是否可以访问
-
@PreAuthorize 是 Spring Security 框架中提供的一个安全注解,用于实现基于注解的访问控制。它允许开发者在方法级别上声明特定的安全约束,以确保只有满足指定条件的用户才能调用该方法
-
当 @PreAuthorize 注解被应用于某个方法时,Spring Security 在该方法执行前会先对当前认证的用户进行权限检查。如果检查通过,方法调用得以继续;否则,框架会抛出相应的权限异常(如 AccessDeniedException),阻止方法执行。
-
@PreAuthorize Spring Security框架的权限注解,在执行方法前执行
-
已经开启注解生效,在SecurityConfig类中添加了如下注解:
-
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
-
-
@ss.hasPermi('system:user:list')
-
其中的ss是一个被spring管理的bean
-
位置:zzyl-framework模块中的
com.zzyl.framework.web.service.PermissionService
-
-
hasPermi 是
PermissionService
类中的一个方法,判断是否拥有该权限 -
system:user:list 为方法的参数
-
不同的接口调用的方式不太一样,不过,基本的思路都是基于http请求来调用,不过,我们之前使用的http请求,都是前端到后端来发起请求,如下图
-
Client客户端一般都是指浏览器发起了请求
-
Server是指服务端,Java的后端服务
如果从后端调用三方接口,一样也是用的http请求,只是这次请求是从后端到另外一个后端服务,我们需要借助工具才能发起请
HTTP客户端工具有很多
-
HttpClient 体量庞大,jdk11以上支持不好
-
OkHttp 学习成本较高
-
Spring提供的 RestTemplate 后期课程feign会重点讲解
-
糊涂工具包