搬运自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."); } } }
让我们仔细看看CheckPermissionAsync。CheckPermissionAsync返回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); } }