• 中文
  • 注册
  • 技术交流 技术交流 关注:3 内容:13

    OpenMod的插件权限设置

  • 查看作者
  • 打赏作者
  • 当前位置: 未转变者中文社区 > 技术交流 > 正文
    • 技术交流
    • 搬运自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);
          }
      }

      请登录之后再进行评论

      登录
      极客之爱
      个人签名:收容失效Q群: 1037114248
      关注3 粉丝3 喜欢1内容14
      上海
    • 做任务
    • 实时动态
    • 签到中心
      小黑屋
    • 到底部