servicestack Servicestack角色用户和组,servicestack,servicestack" /> servicestack Servicestack角色用户和组,servicestack,servicestack" />

servicestack Servicestack角色用户和组

servicestack Servicestack角色用户和组,servicestack,servicestack,因为角色不包含权限。我对ServiceStack中的角色和权限有点困惑。看来他们真的是一回事?我想实现一个具有角色和权限的组。基于servicestack默认实现,我认为无法扩展提供程序并获取嵌套信息 我如何实现这一点,并且仍然使用身份验证属性。 如果我有一个属性 [RequiredPermission("CanAccessPerm")] That is in Role:HasAccessRole That is in Group:HasAccessGroup 我只想使用perm来确定API

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

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

[RequiredPermission("CanAccessPerm")] 
That is in Role:HasAccessRole That is in Group:HasAccessGroup
我只想使用perm来确定API级别的访问。然后通过角色和组来确定谁有烫发。如果角色包含权限,那么我可以扩展CredentialAuthProvider TryAuthenticate,并另外查看组表。有没有办法做到这一点而不重写整个身份验证

编辑12/12 我正在使用 容器。寄存器(c=> 新的OrmLiteAuthRepository(c.Resolve()) { UseDistinctRoleTables=AppSettings.Get(“UseDistinctRoleTables”,true), }); 如何进入iManager角色?我知道我可以覆盖IAuthRepository

我找到了这个链接。但它并不是Auth的替代品

-_编辑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;
        }
    }
container.Register(c=>
新的MyOrmLiteAuthRepository(c.Resolve())
{
UseDistinctRoleTables=AppSettings.Get(“UseDistinctRoleTables”,true),
});
客户授权报告
公共类MyOrmLiteAuthRepository:OrmLiteAuthRepository
{
公共MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory):基(dbFactory){}
公共MyOrmLiteAuthRepository(IDbConnectionFactory dbFactory,字符串名为DConnection=null)
:base(dbFactory,namedconnection)
{
DbFactory=DbFactory;
NamedConnection=NamedConnection;
}
公共IDbConnectionFactory数据库工厂{get;set;}
公共字符串namedConnection{get;set;}
公共覆盖ICollection GetPermissions(字符串userAuthId)
{
var permissions=base.GetPermissions(userAuthId);
使用(var ss=HostContext.ResolveService(new BasicRequest()))
{
permissions=ss.UserPermissions(Convert.ToInt32(userAuthId));
}
返回权限;
}
public override bool HasPermission(字符串userAuthId,字符串权限)
{
var hasPermission=base.hasPermission(userAuthId,permission);
使用(var ss=HostContext.ResolveService(new BasicRequest()))
{
hasPermission=ss.UserHasPermisnRoleOrGroup(权限,Convert.ToInt32(userAuthId));
}
未经许可返回;
}
}

角色/权限的工作原理类似,用户可以有多个角色和权限,但逻辑上不同,角色定义了一个人的角色,如“员工”、“经理”等,权限定义了他们可以访问的功能,如“CanSubmitPurchaseOrders”、“CanReturnCustomers”等

ServiceStack不支持角色本身具有权限,但您可以通过覆盖
OnAuthenticated()在自己的自定义AuthProvider中实现此功能
并使用用户所处的所有角色中的所有权限组合填充
AuthUserSession
权限集。如果未使用自定义AuthProvider,则可以通过实现
OnAuthenticated()
来修改用户会话

或者,如果您使用的是AuthRepository,如
或mliteAuthRepository
,则可以通过覆盖其
GetPermissions()
HasPermission()来更改权限的管理方式
API来检查用户角色分配给他们的权限,您需要在带外表中维护这些权限

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

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

我再次更新了问题。“我现在就快到了。”史蒂夫科尔曼:你能不能用一个新问题问新问题,而不是用新问题更新现有问题。确切的问题是什么,您使用的源代码中有哪些没有调用自定义提供者API?我问了一个新问题。很抱歉,由于我尚未解决原始查询,因此我正在扩展此查询。我喜欢把所有的代码都发布到网上。在一个地方
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);
    }
}