如何从主机中列出具有特定角色的租户用户?
How to list tenant users with specific role from the host?
我正在开发一个使用 ASP.NET 样板构建的项目。我使用的模板是带有 Angular 的 .NET Core,包括零模块。已启用多租户。
我目前正在处理的任务是让主机的管理员查看每个租户中具有 Admin
角色的用户。我在租户列表的弹出菜单(Actions
列)上添加了一个新菜单项。它调用 API 方法并传入 tenantId
.
API 代码如下所示(遵循样板代码模式):
if (tenantId != null)
{
UnitOfWorkManager.Current.SetTenantId(tenantId.Value);
adminRole = await _roleManager.GetRoleByNameAsync("admin");
}
if (tenantId != null && adminRole != null)
{
users = users.Where(u => u.Roles.Any(r => r.RoleId == adminRole.Id));
}
var totalCount = await AsyncQueryableExecuter.CountAsync(users);
users = ApplySorting(users, input);
users = ApplyPaging(users, input);
在应用程序中,我有多个租户。有些有自己的数据库,有些则没有。当租户有自己的独立数据库时,上面的代码按预期工作,而租户没有,我收到一条错误消息:
Required permissions are not granted. At least one of these permissions must be granted: Users
在日志文件中,我有以下异常:
WARN 2017-11-23 10:37:23,101 [45] Mvc.ExceptionHandling.AbpExceptionFilter - 未授予所需的权限。必须至少授予以下权限之一:用户
Abp.Authorization.AbpAuthorizationException: 未授予所需的权限。必须至少授予以下权限之一:用户
在 Abp.Authorization.PermissionCheckerExtensions.d__9.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\PermissionCheckerExtensions.cs: 第 195 行
--- 从先前抛出异常的位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Abp.Authorization.AuthorizationHelper.d__19.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs: 第 48 行
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Abp.Authorization.AuthorizationHelper.d__22.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs:第 98 行
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Abp.Authorization.AuthorizationHelper.d__20.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs: 第 57 行
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(任务任务)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态)
在 System.Threading.Tasks.Task.ExecuteWithThreadLocal(任务和当前任务槽)
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(任务任务)
在 Nito.AsyncEx.AsyncContext.Run(Func'1 操作)在 Abp.Authorization.AuthorizationInterceptor.Intercept(IInvocation 调用)
在 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationInterceptor.cs:第 20 行
在 Castle.DynamicProxy.AbstractInvocation.Proceed()
在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation 调用,UnitOfWorkOptions 选项)在 D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:line 68
在 Castle.DynamicProxy.AbstractInvocation.Proceed()
在 Castle.DynamicProxy.AbstractInvocation.Proceed()
在 Castle.DynamicProxy.AbstractInvocation.Proceed()
在 Castle.Proxies.UserAppServiceProxy.ApplySorting(IQueryable'1 查询,PagedResultRequestDto 输入)
在 CK.Users.UserAppService.d__16.MoveNext() 中 D:\Projects\CK\Development\aspnet-core\src\CK.Application\Users\UserAppService.cs: 第 179 行
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 lambda_method(闭包,对象)
在 Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext()
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__10.MoveNext()
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext 上下文)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14.MoveNext()
--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__23.MoveNext()
这里的问题是,为什么相同的代码适用于拥有自己的数据库的租户,但对于其他人却出现异常?我需要做什么,以便无论租户如何设置,我都可以使此代码正常工作?
欢迎所有建议。
此致,
亚历克斯
看来 AuthorizationInterceptor
不必要地拦截了 ApplySorting
方法。
您可以使用 [AbpAllowAnonymous]
属性安全地覆盖该方法:
[AbpAllowAnonymous]
protected override IQueryable<User> ApplySorting(IQueryable<User> query, UserGetAllInput input)
{
return base.ApplySorting(query, input);
}
我正在开发一个使用 ASP.NET 样板构建的项目。我使用的模板是带有 Angular 的 .NET Core,包括零模块。已启用多租户。
我目前正在处理的任务是让主机的管理员查看每个租户中具有 Admin
角色的用户。我在租户列表的弹出菜单(Actions
列)上添加了一个新菜单项。它调用 API 方法并传入 tenantId
.
API 代码如下所示(遵循样板代码模式):
if (tenantId != null)
{
UnitOfWorkManager.Current.SetTenantId(tenantId.Value);
adminRole = await _roleManager.GetRoleByNameAsync("admin");
}
if (tenantId != null && adminRole != null)
{
users = users.Where(u => u.Roles.Any(r => r.RoleId == adminRole.Id));
}
var totalCount = await AsyncQueryableExecuter.CountAsync(users);
users = ApplySorting(users, input);
users = ApplyPaging(users, input);
在应用程序中,我有多个租户。有些有自己的数据库,有些则没有。当租户有自己的独立数据库时,上面的代码按预期工作,而租户没有,我收到一条错误消息:
Required permissions are not granted. At least one of these permissions must be granted: Users
在日志文件中,我有以下异常:
WARN 2017-11-23 10:37:23,101 [45] Mvc.ExceptionHandling.AbpExceptionFilter - 未授予所需的权限。必须至少授予以下权限之一:用户 Abp.Authorization.AbpAuthorizationException: 未授予所需的权限。必须至少授予以下权限之一:用户 在 Abp.Authorization.PermissionCheckerExtensions.d__9.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\PermissionCheckerExtensions.cs: 第 195 行 --- 从先前抛出异常的位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Abp.Authorization.AuthorizationHelper.d__19.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs: 第 48 行 --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Abp.Authorization.AuthorizationHelper.d__22.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs:第 98 行 --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Abp.Authorization.AuthorizationHelper.d__20.MoveNext() 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs: 第 57 行 --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(任务任务) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.Tasks.Task.ExecuteWithThreadLocal(任务和当前任务槽) --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(任务任务) 在 Nito.AsyncEx.AsyncContext.Run(Func'1 操作)在 Abp.Authorization.AuthorizationInterceptor.Intercept(IInvocation 调用) 在 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationInterceptor.cs:第 20 行 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation 调用,UnitOfWorkOptions 选项)在 D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:line 68 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Castle.Proxies.UserAppServiceProxy.ApplySorting(IQueryable'1 查询,PagedResultRequestDto 输入) 在 CK.Users.UserAppService.d__16.MoveNext() 中 D:\Projects\CK\Development\aspnet-core\src\CK.Application\Users\UserAppService.cs: 第 179 行 --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 lambda_method(闭包,对象) 在 Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext() --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__10.MoveNext() --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext 上下文) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14.MoveNext() --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__23.MoveNext()
这里的问题是,为什么相同的代码适用于拥有自己的数据库的租户,但对于其他人却出现异常?我需要做什么,以便无论租户如何设置,我都可以使此代码正常工作?
欢迎所有建议。
此致, 亚历克斯
看来 AuthorizationInterceptor
不必要地拦截了 ApplySorting
方法。
您可以使用 [AbpAllowAnonymous]
属性安全地覆盖该方法:
[AbpAllowAnonymous]
protected override IQueryable<User> ApplySorting(IQueryable<User> query, UserGetAllInput input)
{
return base.ApplySorting(query, input);
}