Servicestack角色用户和组

时间:2018-12-09 20:15:02

标签: servicestack

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

我将如何实现此目的并且仍然使用身份验证属性。 如果我有一个属性

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

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

编辑12/12 我在用         container.Register(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;
        }
    }

1 个答案:

答案 0 :(得分:2)

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

ServiceStack不支持角色本身具有权限,但是您可以通过覆盖OnAuthenticated()并用以下组合填充Permissions的{​​{1}}个集合来自己在自己的Custom AuthProvider中实现此功能:用户所在的所有角色中的所有权限。如果不使用自定义AuthProvider,则可以通过实现AuthUserSession Session of Auth Event Hooks来修改Users会话。

或者,如果您使用的是OnAuthenticated()之类的AuthRepository,则可以通过覆盖IManageRoles OrmLiteAuthRepositoryGetPermissions() API来检查权限,从而更改权限的管理方式用户角色已分配给他们,您需要在带外表中对其进行维护。

覆盖OrmLiteAuthRepository

OrmLiteAuthRepository实现HasPermission(),因此在需要时可以将IManageRoles强制转换为IAuthRepository,例如:

IManageRoles

您可以覆盖OrmLiteAuthRepository并使用常规继承来实现自己的var manageRoles = (IManageRoles)container.Resolve<IAuthRepository>(); GetPermissions(),例如:

HasPermission()