【问题标题】:Servicestack Roles Users and GroupsServicestack 角色用户和组
【发布时间】:2018-12-09 20:15:02
【问题描述】:

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

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

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

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

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

我找到了这个链接。但它不能替代 Auth ServiceStack - roles and permissions

-_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;
        }
    }

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    角色/权限的工作方式相似,因为用户可以拥有多个角色和权限,但它们在逻辑上不同,因为角色定义了一个人拥有的角色,例如“员工”、“经理”等,而权限定义了他们拥有的功能访问“CanSubmitPurchaseOrders”、“CanRefundCustomers”等。

    ServiceStack 不支持自己拥有权限的角色,但您可以在自己的自定义 AuthProvider 中实现此功能,方法是覆盖 OnAuthenticated() 并使用所有权限的组合填充 AuthUserSession 的用户所在的角色。如果您不使用自定义 AuthProvider,则可以通过实现 OnAuthenticated() Session of Auth Event Hooks 来修改用户会话。

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

    覆盖 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);
        }
    }
    

    【讨论】:

    • 我再次更新了问题。我现在差不多了。
    • @SteveColeman 您能否在新问题中提出新问题,而不是用新问题更新现有问题。确切的问题是什么,您使用的哪些源代码没有调用您的自定义提供程序 API?
    • 我问了一个新问题。抱歉,我正在扩展这个,因为我没有解决原始查询。我喜欢在为所有人在线完成后发布所有代码。在一个地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2015-05-18
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多