由于角色不包含权限。我对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;
}
}
答案 0 :(得分:2)
角色/权限的工作方式相似,一个用户可以具有多个角色和权限,但是它们在逻辑上有所不同,即角色定义了一个人具有的角色,例如“雇员”,“经理”等,而权限定义了他们具有的功能访问诸如“ CanSubmitPurchaseOrders”,“ CanRefundCustomers”等。
ServiceStack不支持角色本身具有权限,但是您可以通过覆盖OnAuthenticated()
并用以下组合填充Permissions
的{{1}}个集合来自己在自己的Custom AuthProvider中实现此功能:用户所在的所有角色中的所有权限。如果不使用自定义AuthProvider,则可以通过实现AuthUserSession
Session of Auth Event Hooks来修改Users会话。
或者,如果您使用的是OnAuthenticated()
之类的AuthRepository,则可以通过覆盖IManageRoles OrmLiteAuthRepository
和GetPermissions()
API来检查权限,从而更改权限的管理方式用户角色已分配给他们,您需要在带外表中对其进行维护。
OrmLiteAuthRepository实现HasPermission()
,因此在需要时可以将IManageRoles
强制转换为IAuthRepository
,例如:
IManageRoles
您可以覆盖OrmLiteAuthRepository并使用常规继承来实现自己的var manageRoles = (IManageRoles)container.Resolve<IAuthRepository>();
和GetPermissions()
,例如:
HasPermission()