Служба стека Роли Пользователи и группы - PullRequest
0 голосов
/ 09 декабря 2018

Поскольку роли не содержат разрешений.Я немного смущен ролями и разрешениями в ServiceStack.Похоже, они действительно одно и то же?Я хочу реализовать группу с ролями, имеющими разрешения.Основываясь на реализации по умолчанию стека служб, я не думаю, что смогу расширить провайдера и получить вложенную информацию.

Как бы мне этого добиться и при этом использовать атрибуты аутентификации.Если бы у меня был атрибут

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

, я бы хотел использовать только perms для определения доступа на уровне API.Затем роли и группы, чтобы определить, у кого есть завивка.Если бы Роли содержали разрешения, тогда я мог бы просто расширить CredentialsAuthProvider TryAuthenticate и дополнительно посмотреть на групповую таблицу.Есть ли способ сделать это и не переписать всю аутентификацию?

Редактировать 12/12 Я использую container.Register (c => new OrmLiteAuthRepository (c.Resolve ()) {UseDistinctRoleTables = AppSettings.Get ("UseDistinctRoleTables", true),});Как мне попасть на роли в IManage?Я вижу, что могу переопределить IAuthRepository.

Я нашел эту ссылку.Но это не замена для Auth ServiceStack - роли и разрешения

-_ 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 голосов
/ 10 декабря 2018

Роли / разрешения работают аналогично в том смысле, что пользователь может иметь несколько ролей и разрешений, но они логически различаются в том смысле, что роль определяет роль, которую имеет человек, такой как «Сотрудник», «Менеджер» и т. Д., А разрешение определяет его функциональность.доступ к таким «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);
    }
}
...