• 中文
    • English
  • 注册
  • 技术交流 技术交流 关注:9 内容:20

    [OpenMod]的插件权限设置

  • 查看作者
  • 打赏作者
  • 当前位置: 未转变者中文社区 > 技术交流 > 正文
    大版主
    Lv.15

    搬运自OpenMod官网,经过翻译,可能有些不足,欢迎指正!原文链接

    权限

    权限可以定义用户执行哪些操作允许,哪些不允许。

    您可以使用IPermissionChecker服务检查用户是否具有特定权限:

    // 有关事件侦听器的详细信息,请阅读事件文档
    public class UserConnectBroadcaster : IEventListener<UserConnectedEvent> 
    {
        private readonly IPermissionChecker m_PermissionChecker;
        private readonly IUserManager m_UserManager;
          
        public UserConnectEventListener(
            IPermissionChecker permissionChecker,
            IUserManager userManager)
        {
            m_PermissionChecker = permissionChecker;
            m_UserManager = userManager;
        }
          
        public async Task HandleEventAsync(object sender, UserConnectedEvent @event)
        {
            var user = @event.User;
            
            if(await m_PermissionChecker.CheckPermissionAsync(user, "announce.join") == PermissionGrantResult.Grant)
            {
                await m_UserManager.BroadcastAsync(user.Type, $"{user.DisplayName} has joined.");
            }
        }
    }

    让我们仔细看看CheckPermissionAsyncCheckPermissionAsync返回PermissionGrantResult,它包含以下成员的枚举:

          Default – 权限既没有明确授予也没有明确拒绝

          Grant – 已明确授予该权限

          Deny – 权限被明确拒绝

    通常要检查结果是否等于PermissionGrantResult.Grant以允许操作。这意味着如果未设置明确权限,则默认情况下将拒绝该操作。如果要执行操作,除非它被明确拒绝,否则改用CheckPermissionAsync(..) != PermissionGrantResult.Deny

    注册您自己的权限

    使用自定义权限的插件需要在被检查之前注册,如果在检查它们时没有注册,你将会得到一个异常。

    要注册您的权限,您需要使用IPermissionRegistry服务并遵循以下示例:

    public class MyPlugin : OpenModUniversalPlugin
    {
        private readonly IPermissionRegistry m_PermissionRegistry;
          
        public UserConnectEventListener(IPermissionChecker permissionRegistry)
        {
            m_PermissionRegistry = permissionRegistry;
        }
          
        public async Task OnLoadAsync()
        {
            m_PermissionRegistry.RegisterPermission(this, "example.permission", "This is a example description for my example permission");
            return Task.CompletedTask;
        }
    }

    在本例中,我们将权限注册为example.permission但要它将会检查的是MyPlugin:example.permission

    你应该在加载插件时注册你的权限。如果有命令相关的权限,则有更好的方法来注册它们,请检查命令文档

    添加您自己的权限存储

    您可以添加自己的权限存储(例如,在MySQL中存储权限):

    实现IPermissionStore接口并通过ServiceConfigurator进行注册:

    public class ServiceConfigurator : IServiceConfigurator
    {
        public void ConfigureServices(IOpenModStartupContext openModStartupContext, IServiceCollection serviceCollection)
        {
            serviceCollection.Configure<PermissionCheckerOptions>(options =>
            {
                options.AddPermissionSource<YourPermissionStore>();
            });        
        }
    }

    覆盖权限检查

    有时你可能想检查一下自己是否有成员的许可。

    实现IPermissionCheckSource通过ServiceConfigurator注册它:

    public class ServiceConfigurator : IServiceConfigurator
    {
        public void ConfigureServices(IOpenModStartupContext openModStartupContext, IServiceCollection serviceCollection)
        {
            serviceCollection.Configure<PermissionCheckerOptions>(options =>
            {
                options.AddPermissionCheckSource<YourPermissionCheckSource>();
            });        
        }
    }

    以下示例将向Unturned的管理员授予所有权限:

    public class UnturnedAdminPermissionCheckProvider : IPermissionCheckProvider
    {
        public bool SupportsActor(IPermissionActor actor)
        {
            /* 仅适用于Unturned的管理员 */
            return actor is UnturnedUser user && user.SteamPlayer.isAdmin;
        }
           
        public Task<PermissionGrantResult> CheckPermissionAsync(IPermissionActor actor, string permission)
        {
            /* 允许任何权限 */
            return Task.FromResult(PermissionGrantResult.Grant);
        }
    }

    请登录之后再进行评论

    登录
  • 发布内容
  • 任务中心
  • 实时动态
  • 日夜切换
  • 帖子间隔 侧栏位置: