授权

介绍

几乎所有企业应用程序都在某种程度上使用授权。授权用于检查是否允许用户在应用程序中执行某些特定操作。ASP.NET Boilerplate定义了一个 基于权限的基础结构来实现授权。

关于IPermissionChecker

授权系统使用IPermissionChecker来检查权限。虽然您可以以自己的方式实现它,但它完全在 Module Zero项目中实现。如果没有实现,则使用NullPermissionChecker向所有人授予所有权限。

定义权限

为每个需要授权的操作定义了唯一权限我们需要在使用之前定义权限。ASP.NET Boilerplate设计为模块化,因此不同的模块可以具有不同的权限。模块应该创建一个派生自AuthorizationProvider的类,以便定义它的权限。示例授权提供程序如下所示:

public class MyAuthorizationProvider : AuthorizationProvider
{
    public override void SetPermissions(IPermissionDefinitionContext context)
    {
        var administration = context.CreatePermission("Administration");

        var userManagement = administration.CreateChildPermission("Administration.UserManagement");
        userManagement.CreateChildPermission("Administration.UserManagement.CreateUser");

        var roleManagement = administration.CreateChildPermission("Administration.RoleManagement");
    }
}

IPermissionDefinitionContext具有获取和创建权限的方法。

使用以下属性定义权限:

权限可以具有父权限和子权限。虽然这不会影响权限检查,但有助于在UI中对权限进行分组。

创建授权提供程序后,我们应该在我们模块的PreInitialize方法中注册它:

Configuration.Authorization.Providers.Add<MyAuthorizationProvider>();

授权提供程序自动注册到依赖注入授权提供程序可以使用其他一些源来注入任何依赖项(如存储库)来构建权限定义。

检查权限

使用AbpAuthorize属性

AbpAuthorizeAbpMvcAuthorize为MVC控制器和 AbpApiAuthorize的Web API控制器)属性是检查权限的最简单,最常用的方法。考虑下面显示应用程序服务方法:

[AbpAuthorize("Administration.UserManagement.CreateUser")]
public void CreateUser(CreateUserInput input)
{
    //A user can not execute this method if he is not granted the "Administration.UserManagement.CreateUser" permission.
}

未授予权限“ Administration.UserManagement.CreateUser ” 的用户无法调用CreateUser方法

AbpAuthorize属性还会检查当前用户是否已登录(使用 IAbpSession.UserId)。如果我们为方法声明AbpAuthorize,它只检查登录:

[AbpAuthorize]
public void SomeMethod(SomeMethodInput input)
{
    //A user can not execute this method if he did not login.
}
AbpAuthorize属性说明

ASP.NET Boilerplate使用动态方法拦截的强大功能进行授权。使用AbpAuthorize属性的方法有一些限制。

也:

注意:有四种类型的授权属性:

这种差异来自继承。在应用程序层中,它完全是ASP.NET Boilerplate的实现,并且它不会扩展任何类。对于MVC和Web API,它继承自这些框架的Authorize属性。

禁止授权

您可以通过向应用程序服务添加AbpAllowAnonymous属性来禁用方法/类的授权 对MVC,Web API和ASP.NET核心控制器使用 AllowAnonymous属性,这是这些框架的本机属性。

使用IPermissionChecker

虽然AbpAuthorize属性对于大多数情况来说足够好,但在某些情况下我们可能想要检查方法体内的权限。我们可以注入并使用IPermissionChecker,如下例所示:

public void CreateUser(CreateOrUpdateUserInput input)
{
    if (!PermissionChecker.IsGranted("Administration.UserManagement.CreateUser"))
    {
        throw new AbpAuthorizationException("You are not authorized to create user!");
    }

    //A user can not reach this point if he is not granted for "Administration.UserManagement.CreateUser" permission.
}

您可以对任何逻辑进行编码,因为IsGranted只返回true或false(它也有Async版本)。如果您只是检查权限并抛出异常,如上所示,您可以使用Authorize 方法:

public void CreateUser(CreateOrUpdateUserInput input)
{
    PermissionChecker.Authorize("Administration.UserManagement.CreateUser");

    //A user can not reach this point if he is not granted for "Administration.UserManagement.CreateUser" permission.
}

由于授权被广泛使用,ApplicationService和一些常见的基类注入并定义PermissionChecker属性。因此,可以在不注入应用程序服务类的情况下使用权限检查程序。

在Razor Views中

基本视图类定义IsGranted方法以检查当前用户是否具有权限。因此,我们可以有条件地渲染视图。例:

@if (IsGranted("Administration.UserManagement.CreateUser"))
{
    <button id="CreateNewUserButton" class="btn btn-primary"><i class="fa fa-plus"></i> @L("CreateNewUser")</button>
}

客户端(JavaScript)

在客户端,我们可以使用abp.auth命名空间中定义的API 在大多数情况下,我们需要检查当前用户是否具有特定权限(具有权限名称)。例:

abp.auth.isGranted('Administration.UserManagement.CreateUser');

您还可以使用abp.auth.grantedPermissions让所有授予的权限或abp.auth.allPermissions获得应用程序中所有可用的权限名。在运行时检查其他人的abp.auth命名空间。

权限管理员

我们可能需要权限的定义。在这种情况下,可以 注入和使用IPermissionManager

nidie.com.cn - 用心与你沟通