3 个版本 (1 个稳定版)
1.0.0 | 2024年1月19日 |
---|---|
0.1.1 | 2023年5月17日 |
0.1.0 | 2023年1月6日 |
#2286 在 魔法豆
每月 72 次下载
在 neptune-common 中使用
9KB
111 行
neptune-auth
此包用于管理任何任意消息类型的调用者认证。
使用方法
第一步是创建某种类型的配置,该配置可以访问存储的地址。
#[derive(Copy, Display)]
#[cw_serde]
pub enum Config {
Admin,
Bot,
}
然后你应该为 Config 实现 GetPermissionGroup。
impl GetPermissionGroup for Config {
fn get_permission_group(&self, deps: Deps<impl CustomQuery>, _env: &Env) -> Result<PermissionGroup, NeptAuthError> {
// How your config accesses storage is up to you
// Here we use a map from cw_storage_plus
Ok(vec![self.load(deps).unwrap()].into())
}
}
然后你可以为给定消息类型中的每个变体分配一个权限组。这里我使用 ExecuteMsg 作为示例。
use crate::config::Config::*;
impl NeptuneAuth for ExecuteMsg {
fn permissions(&self) -> Result<Vec<&dyn GetPermissionGroup>, NeptAuthError> {
Ok(match self {
ExecuteMsg::SetConfig { .. } => vec![&Admin],
ExecuteMsg::AddAsset { .. } => vec![&Bot],
ExecuteMsg::RemoveAsset { .. } => vec![&Bot],
ExecuteMsg::UpdatePrices { .. } => vec![&Admin, &Bot],
})
}
}
最后,你可以在执行入口点(或你想要验证授权的任何地方)放置授权检查。
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn execute(deps: DepsMut<impl CustomQuery>, env: Env, info: MessageInfo, msg: ExecuteMsg) -> Result<Response, MyError> {
// This is the line that checks the permissions
// It will return an error if the caller does not have the required permissions
msg.neptune_authorize(deps.as_ref(), &env, &info.sender)?;
...
}
依赖关系
~3.5–5.5MB
~114K SLoC