R2DBC基础使用

经典业务RBAC

主要是想分享下R2DBC的一些学习重点,然而写了半天,电脑死机,全没了。
心态崩了,有空再写
以角色为基础的访问控制12(英语:Role-based access control,RBAC),是资讯安全领域中,一种较新且广为使用的访问控制机制,其不同于强制访问控制以及自由选定访问控制[3]直接赋予使用者权限,而是将权限赋予角色。1996年,莱威·桑度(Ravi Sandhu)等人在前人的理论基础上,提出以角色为基础的访问控制模型,故该模型又被称为RBAC96。之后,美国国家标准局重新定义了以角色为基础的访问控制模型,并将之纳为一种标准,称之为NIST RBAC。

以角色为基础的访问控制模型是一套较强制访问控制以及自由选定访问控制更为中性且更具灵活性的访问控制技术。

定义

在一个组织中,会因为不同的作业功能产生不同的角色,执行某项操作的权限会被赋予特定的角色。组织成员或者工作人员(抑或其它系统用户)则被赋予不同的角色,这些用户通过被赋予角色来取得执行某项计算机系统功能的权限。

  • S = 主体 = 一名使用者或自动代理人
  • R = 角色 = 被定义为一个授权等级的工作职位或职称
  • P = 权限 = 一种存取资源的方式
  • SE = 会期 = S,R或P之间的映射关系
  • SA = 主体指派
  • PA = 权限指派
  • RH = 角色阶层。能被表示为:≥(x ≥ y 代表 x 继承 y 的权限)
  • 一个主体可对应多个角色。
  • 一个角色可对应多个主体。
  • 一个角色可拥有多个权限。
  • 一种权限可被分配给许多个角色。
  • 一个角色可以有专属于自己的权限。
    所以,用集合论的符号:

R2DBC-mysql数据查询

public interface SysPermissionRepository extends ReactiveCrudRepository<SysPermission, Long> {
Flux<SysPermission> findSysPermissionByCreator(Long creator);
// 由于该方法名符合标准单表查询方法,故无需写sql
Flux<SysPermission> findSysPermissionByName(String name);
@Query("""
SELECT
sp.*
FROM
sys_role_permission srp,
sys_permission sp
WHERE
srp.permission_id = sp.id
AND srp.role_id = :roleId
""")
Flux<SysPermission> findSysPermissionByRoleId(Long roleId);
@Query("""
SELECT
sp.*
FROM
sys_role_permission srp,
sys_permission sp
WHERE
srp.permission_id = sp.id
AND srp.role_id in (:roleIds)
""")
Flux<SysPermission> findSysPermissionByRoleIds(List<Long> roleIds);
}

查询角色及角色锁含有的权限

角色与权限的关系是一对多,角色包含权限集合

// 角色实体
@Getter
@Setter
@Accessors(chain = true)
@Table("sys_role")
public class SysRole implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id
private Long id;
/**
* 角色编码
*/
private String code;
/**
* 角色名称
*/
private String name;
/**
* 角色描叙
*/
private String description;
/**
* 创建人账号id
*/
private Long creator;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime creteTime;
/**
* 修改人账号id
*/
private Long modifiedBy;
/**
* 逻辑删除标识:1,删除。0,未删除
*/
private Integer deleted;
/**
* 权限
*/
@Transient
private List<SysPermission> sysPermissions;
}

故角色查询事项如下

@Log4j2
@Service
@RequiredArgsConstructor
public class SysRoleServiceImpl implements ISysRoleService {
private final SysRoleRepository sysRoleRepository;
private final SysPermissionRepository sysPermissionRepository;
@Override
public Mono<SysRole> findById(Long id) {
return sysRoleRepository.findById(id).flatMap(sysRole ->
sysPermissionRepository.findSysPermissionByRoleId(sysRole.getId()).collectList()
.map(sysPermissions -> sysRole.setSysPermissions(sysPermissions)));
}
@Override
public Flux<SysRole> findSysRoleByUserId(Long userId) {
return sysRoleRepository.findSysRoleByUserId(userId).flatMap(sysRole ->
sysPermissionRepository.findSysPermissionByRoleId(sysRole.getId()).collectList()
.map(sysPermissions -> sysRole.setSysPermissions(sysPermissions)));
}
}

应用配置文件

# oracle
spring.r2dbc.url=r2dbc:oracle:thin://172.31.1.201:1521:keydev
spring.r2dbc.username=username
spring.r2dbc.password=password
# mysql
spring.r2dbc.url=r2dbc:mysql://root:root@120.25.85.114:3306/sso-client?serverTimezone=GMT%2b8&zeroDateTimeBehaviorconvertToNull&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
# sql 打印
logging.level.org.springframework.r2dbc=debug

项目源码地址:https://gitee.com/security-demo/oauth2-client-webflux.git

posted @   临渊不羡渔  阅读(1383)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示