2012-11-03 12 views
7

Podobnie jak we wszystkich aplikacjach dla linii biznesowych, aplikacja może mieć wiele numerów Users z przypisanymi niektórymi Roles. Niedawno przenieśliśmy się do architektury WPV MVVM i szukaliśmy najlepszego sposobu przypisania roli każdemu zalogowanemu użytkownikowi. Istnieje wiele terminów pływających w Internecie, takich jak uwierzytelnianie, RoleManager, LoginService itp., Ale nie jestem pewien, z którym się pracować.Przypisywanie ról użytkownikom aplikacji

Oto co mamy:

mała aplikacja gospodarczej (z 20 Form), opracowany w ramach pojedynczego projektu. Używamy architektury MVVM, LINQ-to-SQL jako DataAccess i Model, z Repository pattern i Unit Of Work.

Co chcemy:

Istnieją różne formy, a każda postać ma wkładkę, aktualizacji, usuwać, drukowania itp operacje. Chcemy ograniczyć zalogowanego użytkownika zgodnie z jego rolą - do zadania, które może wykonać. np. dla np. Administrator może zrobić "dowolną" "z aplikacją, podczas gdy niektórzy inni użytkownicy mogą nie mieć możliwości przeglądania niektórych formularzy lub wykonywania niektórych operacji (mianowicie aktualizacji lub usuwania).

Jak możemy to osiągnąć; jaki rodzaj usługi mógłby zostać wykorzystany do realizacji tego kompletnego mechanizmu z wykorzystaniem architektury MVVM w aplikacji Desktop LOB. Pomocny będzie termin techniczny lub link do samouczka.

Mam nadzieję, że jestem jasny i z góry bardzo dziękuję.

Edytuj: Przeszedłem przez wiele forów i artykułów, ale wszystkie koncentrują się na ASP.NET. Nadal nie można znaleźć konkretnej implementacji dla przypisania ról w ramach WPF. A źródła na ASP.NET nie są zgodne z WPF.

+0

Co MVVM ramy nie używasz lub nie toczyć własną rękę? –

+1

Mamy ten sam problem. Większość uprawnień jest zakodowana na stałe. Planowaliśmy wdrożyć pełną listę ACL. Mój kolega oferuje usługę ról WCF (http://msdn.microsoft.com/en-us/library/bb386424(v=vs.100).aspx) jako gotową infrastrukturę. Jednak wciąż nie jesteśmy pewni najlepszego sposobu na zastosowanie uprawnień w ramach wizualizacji, ponieważ chcemy uniknąć hardcoding w takim stopniu, jak to tylko możliwe. Postanowiliśmy również spojrzeć na Prism. Podejrzewamy, że zawiera on wymaganą funkcjonalność. –

+0

Przy okazji, czy kiedykolwiek rozważałeś użycie AOP do tego zadania? http://izlooite.blogspot.ru/2010/06/aspect-oriented-programming.html http://stackoverflow.com/questions/325558/aspect-oriented-programming-examples http: //www.sharpcrafters .com/ Nota prawna: Jestem nowy w tym podejściu i prawie nic o nim nie wiem. Ale kontakty do kodu są podobne, więc myślę, że mogłoby to pomóc. –

Odpowiedz

4

Sugeruję budowania rozwiązania wokół ASP.NET Membership & Role Management dostawców (mimo edycję oryginalnego pytanie). Są dobrze udokumentowane na MSDN & są bardzo elastyczne.

Oto kilka linków, które powinny miejmy nadzieję, pomóc w integracji WPF:

Ponadto, wspomniałeś, że używasz MVVM; Sugerowałbym posiadanie klasy statycznej lub w inny sposób globalnie dostępnej (patrz: WPF Application using a global variable) instancji scentralizowanej klasy autoryzacji. Metody tej klasy można następnie wywołać z dowolnego miejsca w aplikacji (tj. W ViewModels), aby włączyć/wyłączyć lub pokazać/ukryć odpowiednie funkcje, w oparciu o wszelkie uprawnienia przyznane użytkownikowi.

0

Co mogę zrobić, to utworzyć klasę statyczną w warstwie klienta, zawierającą informacje o bieżącym użytkowniku (role, uprawnienia itp.). Uprawnienia te mogą być modelowane na przykład przez enum lub coś podobnego, a następnie w każdym ViewModelu można zdefiniować, które z tych wartości wyliczeniowych są wymagane na przykład do wykonywania zapytań (przeglądanie rekordów) lub wykonywania poleceń Zapisz lub Edytuj.

0

Po prostu wstawię właściwość RequiredRole do każdego polecenia i dodam nadpisanie CanExecute, które sprawdza, czy bieżący użytkownik ma do tego prawo. To wystarcza dla poleceń.

Z drugiej strony, prawa do wyświetlenia formularza należy sprawdzić w ekranie hosta dyrygent/zakładki/...

Fetch ról i każdą rolę Suer z LINQ do SQL, i to koniec. Nie zawracałbym sobie głowy integracją kodu zewnętrznego do tak prostego zadania.

Jeśli chcesz, aby był bardziej ogólny, należy przechowywać w DB tabelę poleceń/formularzy i ról, a także używać funkcji odbicia, aby autoryzować użytkowników.

Mam nadzieję, że okaże się, że użyteczne

0

używamy AD określenie ról użytkownik należący do. Następnie sprawdź, czy któraś z ról ma odpowiednie uprawnienia.Można jednak użyć tabeli roles i userroles, aby samodzielnie wykonać tę część.

Za pomocą jednego z tych dwóch podejść użytkownik znajdzie się w zestawie ról. To pierwszy krok.

Następnie należy zweryfikować w miejscu akcji, że użytkownik ma pozwolenie. Nasza struktura menu jest dynamicznie budowana z bazy danych, więc mam tabelę MenuItems, a następnie tabelę definiującą RoleMenuAvailability.

Pierwszy ma Id An order The Title, Image source i navigation target wraz z kilku innych dziedzinach.

Drugi ma RoleId i menuId i czy można go edytować. Więc obecność rzędu oznacza jego czytelny (jeśli forma nawigacji cel tj) Pozycje menu są następnie odczytywane z bazy danych:

var usersItems = 
    items.Where(i => i.RoleMenuAvailabilities 
        .Any(r => domainUser.IsInDomainRole(r.UserRole.Description))) 
     .OrderBy(m => m.MenuOrder); 

UserRole.Description w naszym przypadku jest nazwą roli AD i IsInDomainRole jest funkcją pomocnik:

public bool IsInDomainRole(string role) 
{ 
    var regex = new Regex("[^\\\\]+$"); 
    string name = this.Name ?? string.Empty; 
    string domainRole = regex.Replace(name, role); 
    return this.IsInRole(domainRole); 
} 

tabela rolemenuavailability może zostać przedłużony do dodatkowych flagi na nim do usuwania, aktualizacji, dodać itp jeśli wymagane.

Nie wdrożyliśmy w pełni kolejnych etapów, ale chcemy, aby uprawnienia użytkowników były buforowane względem użytkownika. Nasza klasa bazowa ViewModel ma odniesienie do użytkownika, dzięki czemu może wywoływać funkcję CanEdit(int permissionId). Następnie właściwości, które w zasadzie kontrolują widoczność lub polecenia, mogą uzyskać dostęp do uprawnień użytkownika i dowiedzieć się, czy mają zezwolenie na dowolne działanie.

Nadal trwają prace, więc zainteresują nas inne sugestie.

Powiązane problemy