Новая система безопасности Devexpress XAF — критерии в классе SecuritySystemObjectPermissionsObject

Я использую новую систему безопасности в своем проекте XAF. Я создал пользовательские классы безопасности «ExtendedSystemSecurityRole» и «SecuritySystemUser». В классе Updater я создал роль с именем «G1» и ее разрешения следующим образом. Но при запуске пользователь «Джон» не может видеть форму «Покупатель».

ExtendedSecuritySystemRole basicUserRole = ObjectSpace.FindObject<ExtendedSecuritySystemRole>(new BinaryOperator("Name", "G1"));
        if (basicUserRole == null)             
        {
            basicUserRole = ObjectSpace.CreateObject<ExtendedSecuritySystemRole>();
            basicUserRole.Name = "G1";
            SecuritySystemTypePermissionObject userTypePermission =
                ObjectSpace.CreateObject<SecuritySystemTypePermissionObject>();
            userTypePermission.TargetType = typeof(Buyer);
            SecuritySystemObjectPermissionsObject currentUserObjectPermission =
                ObjectSpace.CreateObject<SecuritySystemObjectPermissionsObject>();

            currentUserObjectPermission.Criteria = "[Active] = True";
            currentUserObjectPermission.AllowNavigate = true;
            currentUserObjectPermission.AllowRead = true;
            userTypePermission.ObjectPermissions.Add(currentUserObjectPermission);
            basicUserRole.TypePermissions.Add(userTypePermission);
        }
        ExtendedSecuritySystemUser userJohn =
            ObjectSpace.FindObject<ExtendedSecuritySystemUser>(
            new BinaryOperator("UserName", "John"));
        if (userJohn == null)
        {
            userJohn = ObjectSpace.CreateObject<ExtendedSecuritySystemUser>();
            userJohn.UserName = "John";
            userJohn.SetPassword("");
            userJohn.Roles.Add(basicUserRole);
        }

person Armando    schedule 07.10.2014    source источник
comment
Вы забыли сделать пользователя John активным? Будет ли это работать, если вы удалите критерии? Лучшим местом для поддержки DevExpress является Центр поддержки.   -  person shamp00    schedule 08.10.2014
comment
Джон активен. Да, это работает без критериев. Центр поддержки DevExpress отвечает только зарегистрированным пользователям (с действующей лицензией).   -  person Armando    schedule 08.10.2014


Ответы (1)


Ваши критерии говорят Buyer.Active = True, а не ExtendedSecuritySystemUser.Active = true.

Вы можете создать собственный оператор функции IsCurrentUserActive()

Было бы проще использовать для этого ViewController. Что-то типа:

public class InactiveUsersController : ViewController
{
    public InactiveUsersController()
    {
        this.TargetViewNesting = Nesting.Any;
        this.TargetViewType = ViewType.ListView;
        this.TargetObjectType = typeof(Buyer);
    }

    protected override void OnActivated()
    {
        base.OnActivated();
        ListView listView = View as ListView;
        listView.CollectionSource.Criteria.Remove("InactiveUserFilter"); // clear the filter

        var currentUser = SecuritySystem.CurrentUser as ExtendedSecuritySystemUser;
        if (!currentUser.Active)
        {
            // return empty list if user is inactive
            listView.CollectionSource.Criteria.Add("InactiveUserFilter", CollectionSource.EmptyCollectionCriteria); 
        }
    }
}
person shamp00    schedule 08.10.2014
comment
Спасибо за ответ. Но то, что мне нужно сделать, не имеет ничего общего с ExtendedSecuritySystemUser. Я просто хочу, чтобы система безопасности понимала критерии, неважно, что я пишу. Если я хочу отфильтровать тип покупателя, я бы использовал его атрибуты, такие как [Активный] или другие. Но проблема в том, что система безопасности не выдает никаких исключений и не показывает разумных результатов. - person Armando; 08.10.2014
comment
Какой объект имеет свойство «Активный»? Покупатель или пользователь? В настоящее время ваши критерии, кажется, возвращают нулевые строки. Вы можете использовать тот же синтаксис критериев с XPCollection для проверки набора результатов. - person shamp00; 09.10.2014
comment
Покупатель имеет активную собственность. - person Armando; 09.10.2014
comment
Хорошо, в этом случае вам нужны два отдельных объекта разрешений. Джон должен иметь возможность перейти к представлению списка независимо от каких-либо критериев. Итак, вам нужен объект разрешений с AllowNavigate, но без критериев. Но он не должен иметь возможность читать неактивные строки. Поэтому добавьте еще один отдельный объект разрешений для AllowRead с критериями. - person shamp00; 09.10.2014
comment
Большое спасибо, да, ваше решение сработало. Но мне очень жаль, что в центре поддержки Devexpress ничего нет по этому поводу. Спасибо еще раз :) - person Armando; 10.10.2014