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

MIT 许可证

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");

授予/撤销角色

使用 grantrevoke 方法向账户添加或删除角色。

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