Servicestack 角色用户和组

Servicestack Roles Users and Groups

因为角色不包含权限。我对 ServiceStack 中的 Roles 和 Permission 有点困惑。看来他们真的是一回事?我想实现一个具有角色和权限的组。基于 servicestack 默认实现,我认为我无法扩展提供程序并获取嵌套信息。

我将如何实现这一点并仍然使用身份验证属性。 如果我有一个属性

[RequiredPermission("CanAccessPerm")] 
That is in Role:HasAccessRole That is in Group:HasAccessGroup

我只想使用权限来确定 API 级别的访问权限。然后是 Roles 和 Groups 以确定谁拥有 perms。如果 Roles 包含权限,那么我可以扩展 CredentialsAuthProvider TryAuthenticate 并另外查看一个组 table。有没有办法做到这一点而不重写整个身份验证?

编辑 12/12 我在用 container.Register(c => 新的 OrmLiteAuthRepository(c.Resolve()) { UseDistinctRoleTables = AppSettings.Get("UseDistinctRoleTables", true), }); 我如何获得 IManage 角色?我看到我可以覆盖 IAuthRepository。

我找到了这个 link。但它不能替代 Auth

-_Edit 12/29 -- 它没有调用 MyOrmLiteAuthRepository 中的方法。你知道为什么吗?

AppHost.cs

            container.Register<IAuthRepository>(c =>
                new MyOrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>())
                {
                    UseDistinctRoleTables = AppSettings.Get("UseDistinctRoleTables", true),
                });


CustomAuthRepo
    public class MyOrmLiteAuthRepository : OrmLiteAuthRepository
    {
        public MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory) : base(dbFactory) { }

        public MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory, string namedConnnection = null)
            : base(dbFactory, namedConnnection)
        {
            DbFactory = dbFactory;
            NamedConnnection = namedConnnection;
        }

        public IDbConnectionFactory DbFactory { get; set; }
        public string NamedConnnection { get; set; }

        public override ICollection<string> GetPermissions(string userAuthId)
        {
            var permissions = base.GetPermissions(userAuthId);

            using (var ss = HostContext.ResolveService<SecurityService>(new BasicRequest()))
            {
                permissions = ss.UserPermissions(Convert.ToInt32(userAuthId));
            }

            return permissions;
        }


        public override bool HasPermission(string userAuthId, string permission)
        {
            var hasPermission = base.HasPermission(userAuthId, permission);

            using (var ss = HostContext.ResolveService<SecurityService>(new BasicRequest()))
            {
                hasPermission = ss.UserHasPermInRoleOrGroup(permission, Convert.ToInt32(userAuthId));
            }

            return hasPermission;
        }
    }

Roles/Permissions 的工作方式相似,因为一个用户可以拥有多个角色和权限,但它们在逻辑上是不同的,因为一个角色定义了一个人拥有的角色,例如 "Employee"、"Manager"等,权限定义了他们有权访问的功能,例如 "CanSubmitPurchaseOrders"、"CanRefundCustomers" 等

ServiceStack 不支持角色本身具有权限,但您可以在自己的自定义 AuthProvider 中自己实现此功能,方法是覆盖 OnAuthenticated() 并使用用户所处的所有角色中的所有权限的组合。如果您不使用自定义 AuthProvider,则可以通过实施 OnAuthenticated() Session of Auth Event Hooks.

来修改用户会话

或者,如果您使用的是像 OrmLiteAuthRepository 这样的 AuthRepository,您可以通过覆盖其 IManageRoles GetPermissions()HasPermission() API 来更改管理权限的方式,以同时检查用户角色分配给他们的权限,您需要在带外 table.

中维护这些权限

覆盖 OrmLiteAuthRepository

OrmLiteAuthRepository 实现了 IManageRoles,因此在需要时您可以将 IAuthRepository 转换为 IManageRoles,例如:

var manageRoles = (IManageRoles)container.Resolve<IAuthRepository>();

您可以覆盖 OrmLiteAuthRepository 并使用正常继承实现您自己的 GetPermissions()HasPermission(),例如:

public class MyOrmLiteAuthRepository : OrmLiteAuthRepository
{
    public MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory) : base(dbFactory) { }

    public MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory, string namedConnnection = null) 
        : base(dbFactory, namedConnnection) {}

    public override ICollection<string> GetPermissions(string userAuthId)
    {
        return base.GetPermissions(userAuthId);
    }

    public override bool HasPermission(string userAuthId, string permission)
    {
        return base.HasPermission(userAuthId, permission);
    }
}