Orchard Core 自定义权限配置

在我们为Orchard Core配置了一个新的Module之后,我们要考虑的是谁可以访问这个Module,那么这里就涉及到了一个权限的配置。如下图,添加了自定义的权限:

 Orchard Core源码:https://github.com/OrchardCMS/OrchardCore

我们先看源码可以帮助我们了解这是如何做的。到src---->OrchardCore.Modules下面找到OrchardCore.Roles或者OrchardCore.Contents(也可以参考其他模块)。

以OrchardCore.Roles为例,在控制器中找到了如下一段,这应该就是控制权限的。

再找到当前模块下的Permissions.cs这个类,发现这个Permissions.cs这个类实现了IPermissionProvider这个接口,并且在Startup.cs中注册了这个Permissions.cs

按照这个思路,我们也可以自己自定义一个权限了。先建一个Permissions.cs类,实现IPermissionProvider接口

public class Permissions : IPermissionProvider
    {
        public static readonly Permission ManageRoles = new Permission("ManageRoles", "Managing");//首先一定要有一个基本的权限
        public static readonly Permission APIRoles = new Permission("APIRoles", "API", new[] { ManageRoles });//然后定义一个权限,这个权限隐含(包含)上面那个权限,这个好像是规定这么写的,不然会报错
        public IEnumerable<PermissionStereotype> GetDefaultStereotypes()//为对应的角色默认勾不勾选自定义的权限,下面默认不勾选,如果要默认勾选,那么在Name的下一行加上Permissions = new[] { XXX }
        {
            return new[] {
                new PermissionStereotype {
                    Name = "Administrator",
                },
                new PermissionStereotype {
                    Name = "Editor",
                },
                new PermissionStereotype {
                    Name = "Moderator"
                },
                new PermissionStereotype {
                    Name = "Author",
                },
                new PermissionStereotype {
                    Name = "Contributor",
                },
                new PermissionStereotype {
                    Name = "Authenticated",
                },
                new PermissionStereotype {
                    Name = "Anonymous",
                },
            };
        }

        public IEnumerable<Permission> GetPermissions()
        {
            return new[] { ManageRoles, APIRoles };
        }
    }

在Controller中对需要权限验证的地方加上

public async Task<IActionResult> Index()
{
  if (!await _authorizationService.AuthorizeAsync(User, Permissions.APIRoles))
  {
    return Unauthorized();
  }

  return Content("hihihi");
}

 

然后在Startup.cs的ConfigureServices中加上如下代码

services.AddScoped<IPermissionProvider, WarehouseAPI.Permissions>();  

在源码中,Permissions.cs是注册在了当前模块的Startup.cs中,我一开始也是,但是发现没有注册进去,之后在web项目中的Startup.cs中注册才有效果,这个问题有哪位大神可以讨论一下吗?

 

posted @ 2018-11-12 10:27  SasaL  Views(977)  Comments(2Edit  收藏  举报