|
@@ -8,6 +8,7 @@ using Admin.Core.Repository;
|
|
using Admin.Core.Repository.Admin;
|
|
using Admin.Core.Repository.Admin;
|
|
using Admin.Core.Service.Admin.Permission.Input;
|
|
using Admin.Core.Service.Admin.Permission.Input;
|
|
using Admin.Core.Service.Admin.Permission.Output;
|
|
using Admin.Core.Service.Admin.Permission.Output;
|
|
|
|
+using Microsoft.Extensions.DependencyInjection;
|
|
using System;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
@@ -21,24 +22,27 @@ namespace Admin.Core.Service.Admin.Permission
|
|
private readonly IPermissionRepository _permissionRepository;
|
|
private readonly IPermissionRepository _permissionRepository;
|
|
private readonly IRoleRepository _roleRepository;
|
|
private readonly IRoleRepository _roleRepository;
|
|
private readonly IRolePermissionRepository _rolePermissionRepository;
|
|
private readonly IRolePermissionRepository _rolePermissionRepository;
|
|
- private readonly IRepositoryBase<TenantPermissionEntity> _tenantPermissionRepository;
|
|
|
|
private readonly IUserRepository _userRepository;
|
|
private readonly IUserRepository _userRepository;
|
|
|
|
+ private readonly IRepositoryBase<TenantPermissionEntity> _tenantPermissionRepository;
|
|
|
|
+ private readonly IRepositoryBase<UserRoleEntity> _userRoleRepository;
|
|
|
|
|
|
public PermissionService(
|
|
public PermissionService(
|
|
AppConfig appConfig,
|
|
AppConfig appConfig,
|
|
IPermissionRepository permissionRepository,
|
|
IPermissionRepository permissionRepository,
|
|
IRoleRepository roleRepository,
|
|
IRoleRepository roleRepository,
|
|
IRolePermissionRepository rolePermissionRepository,
|
|
IRolePermissionRepository rolePermissionRepository,
|
|
|
|
+ IUserRepository userRepository,
|
|
IRepositoryBase<TenantPermissionEntity> tenantPermissionRepository,
|
|
IRepositoryBase<TenantPermissionEntity> tenantPermissionRepository,
|
|
- IUserRepository userRepository
|
|
|
|
|
|
+ IRepositoryBase<UserRoleEntity> userRoleRepository
|
|
)
|
|
)
|
|
{
|
|
{
|
|
_appConfig = appConfig;
|
|
_appConfig = appConfig;
|
|
_permissionRepository = permissionRepository;
|
|
_permissionRepository = permissionRepository;
|
|
_roleRepository = roleRepository;
|
|
_roleRepository = roleRepository;
|
|
_rolePermissionRepository = rolePermissionRepository;
|
|
_rolePermissionRepository = rolePermissionRepository;
|
|
- _tenantPermissionRepository = tenantPermissionRepository;
|
|
|
|
_userRepository = userRepository;
|
|
_userRepository = userRepository;
|
|
|
|
+ _tenantPermissionRepository = tenantPermissionRepository;
|
|
|
|
+ _userRoleRepository = userRoleRepository;
|
|
}
|
|
}
|
|
|
|
|
|
public async Task<IResponseOutput> GetAsync(long id)
|
|
public async Task<IResponseOutput> GetAsync(long id)
|
|
@@ -205,7 +209,7 @@ namespace Admin.Core.Service.Admin.Permission
|
|
|
|
|
|
//批量删除权限
|
|
//批量删除权限
|
|
var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
|
|
var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
|
|
- if (deleteIds.Count() > 0)
|
|
|
|
|
|
+ if (deleteIds.Any())
|
|
{
|
|
{
|
|
await _rolePermissionRepository.DeleteAsync(m => m.RoleId == input.RoleId && deleteIds.Contains(m.PermissionId));
|
|
await _rolePermissionRepository.DeleteAsync(m => m.RoleId == input.RoleId && deleteIds.Contains(m.PermissionId));
|
|
}
|
|
}
|
|
@@ -213,7 +217,16 @@ namespace Admin.Core.Service.Admin.Permission
|
|
//批量插入权限
|
|
//批量插入权限
|
|
var insertRolePermissions = new List<RolePermissionEntity>();
|
|
var insertRolePermissions = new List<RolePermissionEntity>();
|
|
var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
|
|
var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
|
|
- if (insertPermissionIds.Count() > 0)
|
|
|
|
|
|
+
|
|
|
|
+ //防止租户非法授权
|
|
|
|
+ if (_appConfig.Tenant && User.TenantType == TenantType.Tenant)
|
|
|
|
+ {
|
|
|
|
+ var masterDb = ServiceProvider.GetRequiredService<IFreeSql>();
|
|
|
|
+ var tenantPermissionIds = await masterDb.GetRepository<TenantPermissionEntity>().Select.Where(d => d.TenantId == User.TenantId).ToListAsync(m => m.PermissionId);
|
|
|
|
+ insertPermissionIds = insertPermissionIds.Where(d => tenantPermissionIds.Contains(d));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (insertPermissionIds.Any())
|
|
{
|
|
{
|
|
foreach (var permissionId in insertPermissionIds)
|
|
foreach (var permissionId in insertPermissionIds)
|
|
{
|
|
{
|
|
@@ -226,8 +239,12 @@ namespace Admin.Core.Service.Admin.Permission
|
|
await _rolePermissionRepository.InsertAsync(insertRolePermissions);
|
|
await _rolePermissionRepository.InsertAsync(insertRolePermissions);
|
|
}
|
|
}
|
|
|
|
|
|
- //清除权限
|
|
|
|
- await Cache.DelByPatternAsync(CacheKey.UserPermissions);
|
|
|
|
|
|
+ //清除角色下关联的用户权限缓存
|
|
|
|
+ var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == input.RoleId).ToListAsync(a => a.UserId);
|
|
|
|
+ foreach (var userId in userIds)
|
|
|
|
+ {
|
|
|
|
+ await Cache.DelAsync(string.Format(CacheKey.UserPermissions, userId));
|
|
|
|
+ }
|
|
|
|
|
|
return ResponseOutput.Ok();
|
|
return ResponseOutput.Ok();
|
|
}
|
|
}
|
|
@@ -235,20 +252,26 @@ namespace Admin.Core.Service.Admin.Permission
|
|
[Transaction]
|
|
[Transaction]
|
|
public async Task<IResponseOutput> SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input)
|
|
public async Task<IResponseOutput> SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input)
|
|
{
|
|
{
|
|
|
|
+ //获得租户db
|
|
|
|
+ var ib = ServiceProvider.GetRequiredService<IdleBus<IFreeSql>>();
|
|
|
|
+ var tenantDb = ib.GetTenantFreeSql(ServiceProvider, input.TenantId);
|
|
|
|
+
|
|
//查询租户权限
|
|
//查询租户权限
|
|
var permissionIds = await _tenantPermissionRepository.Select.Where(d => d.TenantId == input.TenantId).ToListAsync(m => m.PermissionId);
|
|
var permissionIds = await _tenantPermissionRepository.Select.Where(d => d.TenantId == input.TenantId).ToListAsync(m => m.PermissionId);
|
|
|
|
|
|
//批量删除租户权限
|
|
//批量删除租户权限
|
|
var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
|
|
var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
|
|
- if (deleteIds.Count() > 0)
|
|
|
|
|
|
+ if (deleteIds.Any())
|
|
{
|
|
{
|
|
await _tenantPermissionRepository.DeleteAsync(m => m.TenantId == input.TenantId && deleteIds.Contains(m.PermissionId));
|
|
await _tenantPermissionRepository.DeleteAsync(m => m.TenantId == input.TenantId && deleteIds.Contains(m.PermissionId));
|
|
|
|
+ //删除租户下关联的角色权限
|
|
|
|
+ await tenantDb.GetRepository<RolePermissionEntity>().DeleteAsync(a => deleteIds.Contains(a.PermissionId));
|
|
}
|
|
}
|
|
|
|
|
|
//批量插入租户权限
|
|
//批量插入租户权限
|
|
var tenatPermissions = new List<TenantPermissionEntity>();
|
|
var tenatPermissions = new List<TenantPermissionEntity>();
|
|
var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
|
|
var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
|
|
- if (insertPermissionIds.Count() > 0)
|
|
|
|
|
|
+ if (insertPermissionIds.Any())
|
|
{
|
|
{
|
|
foreach (var permissionId in insertPermissionIds)
|
|
foreach (var permissionId in insertPermissionIds)
|
|
{
|
|
{
|
|
@@ -261,11 +284,11 @@ namespace Admin.Core.Service.Admin.Permission
|
|
await _tenantPermissionRepository.InsertAsync(tenatPermissions);
|
|
await _tenantPermissionRepository.InsertAsync(tenatPermissions);
|
|
}
|
|
}
|
|
|
|
|
|
- //清除租户下所有用户权限
|
|
|
|
- if (_appConfig.Tenant)
|
|
|
|
|
|
+ //清除租户下所有用户权限缓存
|
|
|
|
+ var userIds = await tenantDb.GetRepository<UserEntity>().Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
|
|
|
|
+ if(userIds.Any())
|
|
{
|
|
{
|
|
- var userIds = await _userRepository.Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
|
|
|
|
- foreach(var userId in userIds)
|
|
|
|
|
|
+ foreach (var userId in userIds)
|
|
{
|
|
{
|
|
await Cache.DelAsync(string.Format(CacheKey.UserPermissions, userId));
|
|
await Cache.DelAsync(string.Format(CacheKey.UserPermissions, userId));
|
|
}
|
|
}
|
|
@@ -278,7 +301,7 @@ namespace Admin.Core.Service.Admin.Permission
|
|
{
|
|
{
|
|
var permissions = await _permissionRepository.Select
|
|
var permissions = await _permissionRepository.Select
|
|
.WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant, a =>
|
|
.WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant, a =>
|
|
- _permissionRepository.Orm.Select<TenantPermissionEntity>()
|
|
|
|
|
|
+ _tenantPermissionRepository
|
|
.Where(b => b.PermissionId == a.Id && b.TenantId == User.TenantId)
|
|
.Where(b => b.PermissionId == a.Id && b.TenantId == User.TenantId)
|
|
.Any()
|
|
.Any()
|
|
)
|
|
)
|