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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM