Сразу в лоб не получится. Тебе надо делать что то вроде биндинга. Или реакции на принятие данных контролом. Т.е. когда какой нить контрол принимает данные, ты обрабатываешь это событие, и там уж смотришь че за юзер, какие права и что делать с контролом. А для того чтоб обрабатывать контролы нужна как бы их регистрация. Т.е. Есть какойнить хеш. И если ты хочеш что контрол имел совйства реакцции на права, то его надо тыкнуть в этот хеш, а какой-нить обработчик будет рпеагировать на изменение данных контрола и соответственно обрабатывать этот контрол на предмет доступа. Это общая идея. Конкретной реализации не присутсвует. Пища для размышлений
Вот пытаюсь создать достаточно большую БД. Некоторые контролы должны менять свое поведение в зависимости от того, к какой группе принадлежит текщий юзер ( группы не виндовые — я сам их определяю ). То, что есть сейчас:
class UserInfo
{
//тут просто инфа о юзере
...
// тут просто лезем в БД или hash и смотрим разрешено ли группе, в которой находится пользователь, и даем ответ
bool MayView( PermissionGroup );
bool MayAddNew( PermissionGroup );
bool MayDelete( PermissionGRoup );
bool MayEdit( PermissionGroup );
}
public enum PermissionType
{
View = 0,
Edit,
Delete,
Add
}
//Класс, который хранит возможные действия контрола, типа если кнопка может вызвать форму, которая будет просматривать данные из
//Group1, тогда нужно кнопке добавить (Group1,MayView)
public class PermissionsContainer
{
public void Add( PermissionGroup, PermissionType );
// Для всех пар (PermissionGroup,PermissionType) запрашивает разрешение из UserInfo
// положительный ответ будет дан если есть хоть одно разрешение на чтение
public bool checkForViewing();
public static DataPermissionsContainer operator+(DataPermissionsContainer left,
DataPermissionsContainer right)
}
//ну а теперь сам контрол
public MyTextBox:TextBox
{
.....
public Button(PermissionContainer)
{
CheckPermissions();
};
public DataPermissionContainer SetPermission
{
get{ return this.dp }
set{ this.dp = value};
}
public void CheckPermissions()
{
if( this.MayView==false)
this.enabled = false;
if ( this.MayEdit)
this.readonly = true;
//и т.д.
}
}
//гдето в форме будет так
{
....
DataPermissionContainer dp1 = new DataPermissionContainer();
dp.Add(Group1, MayView);
dp.Add(Group1, MayEdit);
MyTextBox tb1 = new MyTextBox(dp1);
MyTextBox tb2 = new MyTextBox(dp1);
DataPermissionContainer dp2 = new DataPermissionContainer();
dp2.Add(Group2, MayView);
dp2.Add(Group2,MayEdit);
tb2.SetPermission += dp2;
}
Вроде это все должно работать, только мне не нравиться решение (слишком громоздкое обьявление, надо добавлять такую функциональность всем контролам системы ) и я не могу придумать ничего лучше. Хочу критику, советы и/или ссылки на готовые решения
03.05.05 13:09: Перенесено модератором из '.NET GUI' — AndrewVK
Здравствуйте, Gmoorick, Вы писали:
G>Вот пытаюсь создать достаточно большую БД. Некоторые контролы должны менять свое поведение в зависимости от того, к какой группе принадлежит текщий юзер ( группы не виндовые — я сам их определяю ). То, что есть сейчас:
skip
G>[/c#]
G>Вроде это все должно работать, только мне не нравиться решение (слишком громоздкое обьявление, надо добавлять такую функциональность всем контролам системы ) и я не могу придумать ничего лучше. Хочу критику, советы и/или ссылки на готовые решения
А почему тебе не сделать у юзера внутри список групп, к которым он принадлежит? Потом пару методов у юзера, возвращающие что можно пользователю, в зависимости от групп. А где-то на форме сделать вот так:
MyTextBox tb1 = new MyTextBox(dp1);
tb1.Visible = currentuser.CanView;
Или я не до конца понял замысел?
Не относитесь слишком серьезно к жизни, живыми вам все равно из неё не выйти
Здравствуйте, BaTReligioN, Вы писали:
BTR>Здравствуйте, Gmoorick, Вы писали:
G>>Вот пытаюсь создать достаточно большую БД. Некоторые контролы должны менять свое поведение в зависимости от того, к какой группе принадлежит текщий юзер ( группы не виндовые — я сам их определяю ). То, что есть сейчас:
BTR>skip
G>>
G>>Вроде это все должно работать, только мне не нравиться решение (слишком громоздкое обьявление, надо добавлять такую функциональность всем контролам системы ) и я не могу придумать ничего лучше. Хочу критику, советы и/или ссылки на готовые решения
BTR>А почему тебе не сделать у юзера внутри список групп, к которым он принадлежит? том пару методов у юзера, возвращающие что можно пользователю, в зависимости от групп. А где-то на форме сделать вот так:
Т.е. вот так:
BTR>MyTextBox tb1 = new MyTextBox(dp1);
BTR>tb1.Visible = currentuser.CanView;
делать не получиться, потому что мы не знаем, какие данные tb1 просматривает...
BTR> Или я не до конца понял замысел?
Видимо не доконца. Система примерно такая, я разделил БД на несколько групп ( DataGroup ), так чтобы на каждую группу можно было установить разрешения для каждой UserGroup. Т.е. вот есть у меня виртуальная группа данных AdressBook, и я задаю разрешения в своей бд примерно так:
AdressBook — CanView — All
AdressBook — CanEdit — Secretars
ADressBook — CanAdd — Secretars
AdressBook — CanDelete — Admins
есть еще связка User, UserGroup.
В программе этой связкой занимается UserInfo, c помощью св-ств аля
bool CanView ( DataGroup );
т.е. я всегда могу получить разрешения на юзера так:
UserInfo curUser = new UserInfo.Instance;
if( curUser.CanView(AdressBook ) )
MessageBox.Show( " Можно смотреть " ) ;
Далее, изза чего все заморочки. 1 конрол на форме может влиять на несколько DataGroup, поетому ему надо определить, что именно и с какой DataGroup он делает.Это я определяжю с помощью DataPermissions. Потом этот самый контрол будет на основы данных в DataPermissions запрашивать UserInfo о том, разрешено ли юзеру выполнять определенное действие.
Здравствуйте, nauro, Вы писали:
N>Сразу в лоб не получится. Тебе надо делать что то вроде биндинга. Или реакции на принятие данных контролом. Т.е. когда какой нить контрол принимает данные, ты обрабатываешь это событие, и там уж смотришь че за юзер, какие права и что делать с контролом. А для того чтоб обрабатывать контролы нужна как бы их регистрация. Т.е. Есть какойнить хеш. И если ты хочеш что контрол имел совйства реакцции на права, то его надо тыкнуть в этот хеш, а какой-нить обработчик будет рпеагировать на изменение данных контрола и соответственно обрабатывать этот контрол на предмет доступа. Это общая идея. Конкретной реализации не присутсвует. Пища для размышлений
о, спасибо. Будет над чем подумать