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);
}
}
因为角色不包含权限。我对 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);
}
}