常规权限系统的 结构
权限框架用的SPringSecurity,表结构在 Hzero数据库里面,用户,角色,客户端,权限,登入后,查询用户的role拥有的权限,判断是否具有接口权限
几个概念
租户层 或 平台层
租户
(这两个概念的对比我还不清楚)
(下面都是 以 租户 而不是 租户层)
用户
(用户和角色间,有分配关系)
角色 (新建角色 的时候 有角色 是 什么层的)
(角色和客户端间,有分配关系)
客户端
接口/权限/资源(这里的接口权限,不代表只是接口,而是系统所有资源)
(角色和接口权限件有授权分配关系,
切接口权限只 直接 分配授权给 角色)
从上面可以看出,一切以角色为核心,
客户端访问接口,是 客户端 <=> 角色 <=> 接口/权限
每个客户端 有一个 authentic token,客户端和角色之间 用 token联系,即客户端 token 角色 表
角色和接口权限,有角色 接口权限表
即通过 token 可以 找到 可以访问的接口权限
所以,只要是客户端 访问 接口,都得带上 token
所以,只要访问接口,必须最终得 带着角色信息去访问,客户端token最后也是角色,自己写接口 去访问,也是带着 @Permission(level = ResourceLevel.ORGANIZATION) 去访问,
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Permission {
/**
* API编码,默认为 {@link Api#tags()} + 方法名 组成 API编码
*
* @return 权限编码
*/
String code() default "";
/**
* 角色
*
* @return 角色数组
*/
String[] roles() default {};
/**
* 级别
*
* @return 级别
*/
ResourceLevel level() default ResourceLevel.PROJECT;
/**
* 登陆后即可拥有的权限
*
* @return 是否登录可访问接口
*/
boolean permissionLogin() default false;
/**
* 公共权限,不需要登录就可访问
*
* @return 是否为公开接口
*/
boolean permissionPublic() default false;
/**
* 只能服务内部调用,不能通过网关访问
*
* @return 是否为内部接口
*/
boolean permissionWithin() default false;
/**
* 需验证签名才可访问的接口
*
* @return 是否为签名接口
*/
boolean permissionSign() default false;
/**
* API标签
*
* @see ApiTag
* @return API标签
*/
String[] tags() default {};
/**
* 接口变更状态,默认未做任何变更 <p></p>
* 如:<i>/v1/xx</i> 升级至 <i>/v2/xx</i>,需在 <i>/v2/xx</i> 上配置 status = {@link PermissionStatus#UPGRADE},并配置原API
*
* @return 变更状态
* @see Permission#upgradeApiPath()
* @see Permission#upgradeApiMethod()
*/
PermissionStatus[] status() default { PermissionStatus.NONE };
/**
* 升级的API
*/
String upgradeApiPath() default "";
/**
* 升级的API方法
*/
HttpMethod upgradeApiMethod() default HttpMethod.GET;
}
@Permission ,设置API访问权限,常用有三种属性
level :设置访问资源层级,包括 site,organization 两种层级
permissionLogin :设置是否需要登录访问
permissionPublic :设置任意访问。
注意permissionLogin :设置是否需要登录访问,即客户端登入(带token),登入后,要看角色是否 拥有这些api的访问权限,一般就用Hzero系统的token,这些api都可以访问,除了对于接口平台的 授权角色授权客户端后,访问接口平台的暴露地址,可以用我们配置的客户端的token访问接口
soga,访问 hezero权限平台控制的接口,必须得要角色
所以每个接口 上平台后,都得给 角色 分配 接口权限,但是Hzero,有些角色,是自动拥有,所有接口的权限的,底层有代码自动分配,而且有些客户端是绑定这些角色的,所以 你用这些客户端的token 和 这些角色 可以访问任何接口,不懂手动分配 接口权限
客户端
客户端是OAuth2.0授权中所需的客户端(client),无论是系统的标准登录,或者外部系统要访问我们系统的某些API,都离不开客户端。一个前端应用就可以理解为就是一个客户端。
在客户端管理中,可以根据实际需求创建客户端,并指定客户端授权模式(密码模式、隐式模式、授权码模式、客户端模式),配置访问令牌、刷新令牌的失效时间等。除了OAuth2.0客户端标准的配置外,我们还支持在客户端上配置 接口加密 、密码防重放、API防重放、密码加密传输、账号加密传输等等
授权模式
密码模式(password):使用client_id和client_secret以及用户名密码直接获取token
客户端授权模式(client_credentials):该模式直接根据client_id和client_secret即可获取token,无需用户参与
授权码模式(authorization_code):使用client_id和client_secret访问授权页面,用户授权后获取授权码,通过授权码换取token
简化模式(implicit):相较于authorization_code模式缺少获取授权码步骤,使用client_id和client_secret访问授权页面,用户授权后返回token
令牌刷新模式(refresh_token):通过refresh_token来刷新token的有效时间。
权限系统的 组织架构
用户
(员工和用户之间,互相分配)
员工
(员工和组织架构,相互分配)
组织架构
(组织架构,可以将组织,树形管理起来,然后组织下面,分配员工,这样完整的组织架构就出来了)
即 (用户 员工 组织架构) 表
工作流…
在组织架构下,都是以员工 为 基础来进行的,而不是用户,等于是,某个用户登入系统后 以某种员工的身份,来开启某个工作流
而且组织架构中人员的存在 也是 以员工为基础的,而不是系统用户,员工才是工作人员的身份,而用户只是系统的使用权
可以说用户 只是系统的使用权,而对于公司组织来说,是看以员工为基础的,登入系统需要用户登入,而业务记录,是员工
简单来说,用户是来 记录登入系统的(以公司人员来说),当然是客户系统的用户,可以 在业务里记录用户信息
角色 是来 对应权限的
组织是来管理 公司架构的
人员 是来记录 公司的业务信息的基础的
这4者创建时,或者所有层面(包括,组织层....)没有任何关系,都是相互分配关系后,就可以用从这几个层面,来共同 操作系统,一个层面是无法操作系统的
例如只有用户,没有角色,那么,你就无法获得任何权限,没有用户,那么你连系统都登不进去,所以 用户是必须有的,其他所有,层面都得跟用户建立联系,
但是在 具体某个操作时,我们只管 对应的层次 的功能,例如用户A登入,此时角色是B,B角色有操作 C接口的权限,那么在操作权限 这个角度,我们只考虑 角色B,而不是 用户A,在登入系统这个角度,我们只考虑用户A,而不是角色B,
员工分配用户和组织架构,不是说这个员工没有分配角色,没有访问接口的权限,不是这样的,这个员工,只是工作流中的一个数据信息,而执行工作流接口,得需要有这个 权限的角色 去执行
不明白的几点
1.租户,租户层,平台层的区别
2.接口有 租户层,平台层
3.角色有平台层,租户层