using System.Threading.Tasks;
using Abp;
using Abp.Authorization;
using Abp.Dependency;
using Abp.Domain.Uow;
using Castle.Core.Logging;
using IwbZero.Authorization.Roles;
using IwbZero.Authorization.Users;
using IwbZero.Runtime.Session;
namespace IwbZero.Authorization.Permissions
{
///
/// Application should inherit this class to implement .
///
///
///
public abstract class PermissionChecker : IPermissionChecker, ITransientDependency, IIocManagerAccessor
where TRole : IwbSysRole, new()
where TUser : IwbSysUser
{
private readonly IwbUserManager _userManager;
public IIocManager IocManager { get; set; }
public ILogger Logger { get; set; }
public IIwbSession AbpSession { get; set; }
public ICurrentUnitOfWorkProvider CurrentUnitOfWorkProvider { get; set; }
///
/// Constructor.
///
protected PermissionChecker(IwbUserManager userManager)
{
_userManager = userManager;
Logger = NullLogger.Instance;
AbpSession = NullIwbSession.Instance;
}
public virtual async Task IsGrantedAsync(string permissionName)
{
return AbpSession.UserId.HasValue && await _userManager.IsGrantedAsync(AbpSession.UserId.Value, permissionName);
}
public virtual async Task IsGrantedAsync(long userId, string permissionName)
{
return await _userManager.IsGrantedAsync(userId, permissionName);
}
[UnitOfWork]
public virtual async Task IsGrantedAsync(UserIdentifier user, string permissionName)
{
if (CurrentUnitOfWorkProvider == null || CurrentUnitOfWorkProvider.Current == null)
{
return await IsGrantedAsync(user.UserId, permissionName);
}
using (CurrentUnitOfWorkProvider.Current.SetTenantId(user.TenantId))
{
return await _userManager.IsGrantedAsync(user.UserId, permissionName);
}
}
}
}