我尝试为新模块设置权限。否则它们似乎有效,但默认值被忽略,没有检查我在代码中设置的角色权限对。我的代码(Permissions.cs)似乎没问题:
using System.Collections.Generic;
using Orchard.Environment.Extensions.Models;
using Orchard.Security.Permissions;
using Orchard.Environment.Extensions;
using My.Module.Utils;
namespace My.Module
{
public class Permissions : IPermissionProvider {
public static readonly Permission AccessMyModule = new Permission {
Description = Constants.AccessAddon, Name = "AccessMyModule"
};
public virtual Feature Feature { get; set; }
public IEnumerable<Permission> GetPermissions() {
return new[] {
AccessMyModule
};
}
public IEnumerable<PermissionStereotype> GetDefaultStereotypes() {
return new[] {
new PermissionStereotype {
Name = Constants.MyModuleAdministratorRole,
Permissions = new[] { AccessMyModule }
}
};
}
}
}
我仔细检查了Constants
中存储的所有常量及其引用是否有效。这里的代码片段是简化的,事实上我在我的项目中有更多的权限和更多的角色,但我确认评论除了一个权限和一个角色没有解决问题。同一解决方案中其他模块的默认设置工作正常,但IntelliSense没有报告任何错误,模块中的其他任何内容似乎都有效。那么问题的根源还有哪些呢?
GetDefaultStereotypes()
只在重新安装后才真正运行。但是,重新安装后启用模块时发生错误,因此未加载默认值。我知道所谓的方法是检查仪表板中的角色 - 权限名称,但我想找到另一种解决方法,因为
GetDefaultStereotypes()
方法正在DefaultRoleUpdater
中的班级Orchard.Roles
调用。它是从Orchard核心深处的某个地方自动调用的,所以简单地模仿呼叫并在启动时运行它并不容易。我也尝试模仿整个函数并将其放入我的permissions
类(或自定义服务),但现在我迷失了如何运行它。它不是静态的,但它是我的Permissions
类的一部分或引用它,它默认情况下不允许普通引用(它没有适当的构造函数)而且我不想通过将课程改为不是也不应该成为的东西来搞乱它。
答案 0 :(得分:1)
只需设置迁移所需的默认权限,而不是使用GetDefaultStereotypes()
。这是一个简短的例子:
public class MyMigration: Orchard.Data.Migration.DataMigrationImpl
{
// public
public MyMigration(Orchard.Roles.Services.IRoleService aRoleService)
{
mRoleService = aRoleService;
}
public int Create()
{
//mRoleService.CreateRole("MyRoleName");
//mRoleService.UpdateRole("MyRoleName", MyPermissions)
return 1;
}
// private
Orchard.Roles.Services.IRoleService aRoleService mRoleService;
}