5 个版本
0.1.5 | 2022 年 11 月 12 日 |
---|---|
0.1.4 | 2022 年 4 月 22 日 |
0.1.3 | 2022 年 4 月 22 日 |
0.1.2 | 2022 年 4 月 22 日 |
0.1.1 | 2022 年 4 月 22 日 |
#6 in #terra
14KB
205 行
cosmwasm-rbac
在 CosmWasm 上实现基于角色的访问控制(RBAC)的实用工具。
示例
定义角色
主要接口是 Role
,它基本上是一个包含具有角色的地址的状态。它支持常量初始化器,因此您可以在 cw_storage_plus
风格中自由定义它。
例如,在您的 state.rs
use cosmwasm_rbac::Role;
const ADMINS: Role = Role::new("admins");
const USERS: Role = Role::new("users");
授予/撤销角色
使用 grant
和 revoke
方法向账户添加或删除角色。
ADMINS.grant(deps.storage, address)?;
USERS.revoke(deps.storage, address)?;
检查角色
has(Deps, &Addr)
方法在给定地址具有角色时返回 true
。
if !ADMINS.has(deps, &info.sender) {
// not an admin! raise your error here
return Err(ContractError::Unauthorized {})
}
或者,如果您的 ContractError
包含一个 cosmwasm_rbac::RbacError
,您只需简单地使用 check(Deps, &Addr)
方法,该方法返回 Result<RbacError>
。
#[derive(Error, Debug, PartialEq)]
pub enum ContractError {
// if you contain `RbacError`
#[error("{0}")]
Rbac(#[from] cosmwasm_rbac::RbacError),
}
// then you can simply check (`check` returns `Result`)
ADMINS.check(deps, &address)?;
使用通用查询/执行处理器
cosmwasm_rbac
提供了管理 RBAC 的有用通用查询/执行。例如,在您的查询消息和处理程序中,请定义携带 RbacQueryMsg
的枚举,并在处理程序上调用 handle_query(...)
。
#[cw_serde]
pub enum QueryMsg {
Admin(cosmwasm_rbac::RbacQueryMsg),
// ...your queries here
}
#[entry_point]
pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult<Binary> {
match msg {
Admin(rbac_msg) => Ok(ADMINS.handle_query(deps, rbac_msg)?),
// ...your query handler here
}
}
这添加了以下查询:(有关详细信息,请参阅 src/query.rs
)
{
"admin": {
"has_role": {
"address": "<address>"
}
}
}
{
"admin": {
"all_accounts": {}
}
}
与查询不同,对于执行,请务必在调用 handle_execute
之前手动检查权限。如果不这样做,任何人都可以修改您的角色!
#[cw_serde]
pub enum ExecuteMsg {
User(cosmwasm_rbac::RbacExecuteMsg),
// ...your executions here
}
#[cw_serde]
pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> Result<Response, ContractError> {
match msg {
User(rbac_msg) => {
// CHECK NEEDED: only admin can manage minters
ADMINS.check(deps, &info.sender)?;
Ok(USERS.handle_execute(deps, info, msg)?)
},
// ...your execution handler here
}
}
这添加了以下执行:(有关详细信息,请参阅 /src/execute.rs
)
{"admin": {"grant": {"address": "<address>"}}}
{"admin": {"revoke": {"address": "<address>"}}}
{"admin": {"transfer": {"to": "<address>"}}}
许可证:MIT
依赖项
~3.5–5.5MB
~117K SLoC