Orchard

时间:2016-06-06 08:22:35

标签: permissions orchardcms

我尝试为新模块设置权限。否则它们似乎有效,但默认值被忽略,没有检查我在代码中设置的角色权限对。我的代码(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没有报告任何错误,模块中的其他任何内容似乎都有效。那么问题的根源还有哪些呢?

编辑:我跟踪了@mdameer的评论并确认GetDefaultStereotypes()只在重新安装后才真正运行。但是,重新安装后启用模块时发生错误,因此未加载默认值。我知道所谓的方法是检查仪表板中的角色 - 权限名称,但我想找到另一种解决方法,因为

  • 我想解决发生的错误,也不要冒险在生产服务器上发生这种错误,而且我无法多次删除并重新安装这个相当复杂的模块来调试它。这可能是由重新安装过程引起的,在权限初始化中没有任何地方,但我无法在不运行代码的情况下知道。
  • 有数十个角色受到影响,因此每次依靠某人手动点击权限意味着可能会因人为因素而出现错误。

GetDefaultStereotypes()方法正在DefaultRoleUpdater中的班级Orchard.Roles调用。它是从Orchard核心深处的某个地方自动调用的,所以简单地模仿呼叫并在启动时运行它并不容易。我也尝试模仿整个函数并将其放入我的permissions类(或自定义服务),但现在我迷失了如何运行它。它不是静态的,但它是我的Permissions类的一部分或引用它,它默认情况下不允许普通引用(它没有适当的构造函数)而且我不想通过将课程改为不是也不应该成为的东西来搞乱它。

1 个答案:

答案 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;
}