网上关于eos用户权限管理的内容已经有很多了,这里就不讨论了,这里主要讨论几张跟用户权限相关的表(关于eos数据库请参考 EOS内存数据库chainbase深入解析),跟用户权限相关的表一共有3张
void authorization_manager::add_indices() {
_db.add_index<permission_index>();
_db.add_index<permission_usage_index>();
_db.add_index<permission_link_index>();
}
- permission_usage_index
该表很简单,它的表结构permission_usage_object定义
class permission_usage_object : public chainbase::object<permission_usage_object_type, permission_usage_object> {
OBJECT_CTOR(permission_usage_object)
id_type id;
time_point last_used; //记录一个权限最后一次使用时间,它总是跟permission_index关联
};
- permission_index
该表的表结构定义permission_object 如下, 该表由可以通过cleos set account permission来修改
class permission_object : public chainbase::object<permission_object_type, permission_object> {
OBJECT_CTOR(permission_object, (auth) )
id_type id;
permission_usage_object::id_type usage_id; // 记录该权限最后一次使用时间
id_type parent; // 父权限,例如默认active的父权限就是owner
account_name owner; // 这个权限属于哪个账户
permission_name name; // 权限名称,例如active
time_point last_updated; // 权限最后一次修改时间(cleos set account permission 命令修改)
shared_authority auth; // 执行该权限需要的授权
}
上述permission_object中的auth表示执行该权限需要的授权,shared_authority的定义如下:
struct shared_authority {
...
uint32_t threshold = 0; // 需要的阈值
shared_vector<key_weight> keys; // 授权的公钥列表
shared_vector<permission_level_weight> accounts; // 授权的账号列表 例如 active@usera
shared_vector<wait_weight> waits; // 需要等待时间列表
}
上述shared_authority 要想成功执行一个权限 keys,accounts,waits 3者的权重加起来必须 >= threshold
才能执行
- permission_link_index
该表的表结构定义permission_link_object如下
class permission_link_object : public chainbase::object<permission_link_object_type, permission_link_object> {
OBJECT_CTOR(permission_link_object)
id_type id;
account_name account; // 账号名称
permission_name required_permission; // 权限名称
account_name code; // 合约名称
action_name message_type; // action name
};
该表记录一个action跟一个用户的某个权限绑定,那么以后该用户执行该action时候只能使用该关联的权限来执行该action,我们可以通过cleos set action permission来设置它,如果一个action没有跟一个用户的权限显式的通过上述关联,那么默认的作为行使action的权限就是用户的active权限
网友评论