using Abp;
using Abp.Authorization;
using Abp.Dependency;
using Abp.Domain.Uow;
using Castle.Core.Logging;
using VberZero.Authorization.Users;
using VberZero.Session;
using ILogger = Castle.Core.Logging.ILogger;
namespace VberZero.Authorization;
///
/// 应用程序应该继承这个类来实现。
///
public class VzPermissionChecker : IPermissionChecker, ITransientDependency, IIocManagerAccessor
{
private readonly VzUserManager _userManager;
public IIocManager IocManager { get; set; }
public ILogger Logger { get; set; }
public IVzSession AbpSession { get; set; }
public ICurrentUnitOfWorkProvider CurrentUnitOfWorkProvider { get; set; }
public IUnitOfWorkManager UnitOfWorkManager { get; set; }
public VzPermissionChecker(VzUserManager userManager)
{
_userManager = userManager;
Logger = NullLogger.Instance;
AbpSession = NullVzSession.Instance;
}
public virtual async Task IsGrantedAsync(string permissionName)
{
return AbpSession.UserId.HasValue && await IsGrantedAsync(AbpSession.UserId.Value, permissionName);
}
public virtual bool IsGranted(string permissionName)
{
return AbpSession.UserId.HasValue && IsGranted(AbpSession.UserId.Value, permissionName);
}
public virtual async Task IsGrantedAsync(long userId, string permissionName)
{
return await _userManager.IsGrantedAsync(userId, permissionName);
}
public virtual bool IsGranted(long userId, string permissionName)
{
return _userManager.IsGranted(userId, permissionName);
}
public virtual async Task IsGrantedAsync(UserIdentifier user, string permissionName)
{
return await UnitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
if (CurrentUnitOfWorkProvider.Current == null)
{
return await IsGrantedAsync(user.UserId, permissionName);
}
using (CurrentUnitOfWorkProvider.Current.SetTenantId(user.TenantId))
{
return await IsGrantedAsync(user.UserId, permissionName);
}
});
}
public virtual bool IsGranted(UserIdentifier user, string permissionName)
{
return UnitOfWorkManager.WithUnitOfWork(() =>
{
if (CurrentUnitOfWorkProvider.Current == null)
{
return IsGranted(user.UserId, permissionName);
}
using (CurrentUnitOfWorkProvider.Current.SetTenantId(user.TenantId))
{
return IsGranted(user.UserId, permissionName);
}
});
}
}