Роли / разрешения работают аналогично в том смысле, что пользователь может иметь несколько ролей и разрешений, но они логически различаются в том смысле, что роль определяет роль, которую имеет человек, такой как «Сотрудник», «Менеджер» и т. Д., А разрешение определяет его функциональность.доступ к таким «CanSubmitPurchaseOrders», «CanRefundCustomers» и т. д.
ServiceStack не поддерживает роли, имеющие сами разрешения, но вы можете самостоятельно реализовать эту функцию в своем собственном пользовательском AuthProvider, переопределив OnAuthenticated()
и заполнив Permissions
коллекции AuthUserSession
с комбинацией всех разрешений во всех ролях, в которых находится пользователь. Если вы не используете пользовательский AuthProvider, вы можете изменить сеанс пользователей, реализовав OnAuthenticated()
сеанс события авторизации.Хуки .
В качестве альтернативы, если вы используете AuthRepository, такой как OrmLiteAuthRepository
, вы можете изменить способ управления разрешениями, переопределив его 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);
}
}