經典業務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