gpt4 book ai didi

Servicestack 角色用户和组

转载 作者:行者123 更新时间:2023-12-01 13:17:13 24 4
gpt4 key购买 nike

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

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

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

我只想使用权限来确定 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 中的方法。你知道为什么吗?

应用程序主机
            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;
}
}

最佳答案

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

ServiceStack 不支持角色本身具有权限,但您可以通过覆盖 OnAuthenticated() 在您自己的自定义 AuthProvider 中自己实现此功能。并填充 Permissions收藏 AuthUserSession结合用户所在的所有角色中的所有权限。如果您没有使用自定义 AuthProvider,您可以通过实现 OnAuthenticated() 来修改用户 session 。 Session of Auth Event Hooks .

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

覆盖 OrmLiteAuthRepository

OrmLiteAuthRepository 实现 IManageRoles所以在需要的时候你可以投 IAuthRepositoryIManageRoles ,例如:

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

关于Servicestack 角色用户和组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53696263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com