2012-05-08 12 views
6

Wprowadzam kontrolę dostępu do witryny intranetowej. Co byłoby łatwe, gdyby firma nie miała ponad 200 pracowników i niestandardowych uprawnień dla prawie każdego. To szaleństwo, wiem, ale nie mogę tego zmienić.Czy istnieje proste ogólne wdrożenie kontroli dostępu opartej na regułach?

Tak więc, próbowałem znaleźć ogólną implementację, która spełniłaby moje potrzeby, ale nie mogła go znaleźć, więc poszedłem zrobić to sam. W końcu wymyśliłem dość ogólne rozwiązanie, które pozwoliło mi pomyśleć: ktoś musiał to zrobić wcześniej!

Nazwałem to ZATRZYMANIE (Subject Object Object Permission) Kontrola dostępu. Mam następującą zależność:

.-------.  .-----------.  .-------. 
| users |1---*| STOPRules |*---1| tasks | 
`-------'  '-----------'  '-------' 

przystanku reguła ma następujące atrybuty

STOPRule { 
    Subject; 
    Task; 
    ObjectType; 
    Permission; 
    Relation; 
} 

Przedmiotem relacja może być: właściciel, twórca, revisor, itd. To pole nie jest wymagane, aby wspierać ogólne zadania. Kiedy tam jest, relacja między bieżącym użytkownikiem a instancją obiektu jest obliczana przez delegata. Bieżąca relacja jest następnie porównywana z wymaganą relacją reguły, aby umożliwić lub zabronić dostępu.

Daj mi znać, jeśli nie jestem wystarczająco jasny.

pojawiają się dwie kwestie:

  1. Czy istnieje implementacja open source jak ten?

  2. Czy widzisz jakieś problemy, które napotkałabym podążając tą ścieżką?

EDIT: poszedł do przodu i faktycznie zaczął realizować ten model. Pierwszy problem polegał na tym, że potrzebowałem relacji między podmiotem a przedmiotem, aby wesprzeć każdy przypadek użycia. Teraz mogę zapisać następującą regułę:

John (z zastrzeżeniem) może (zezwolenie) edit (zadanie) zamówienie (object) jeżeli osoba jest twórca (relacja) z zamówienie.

Proszę, czy możecie przedstawić REALISTYCZNĄ przypadek użycia, którego nie można wyrazić za pomocą tego modelu?

+2

+1 dla atmosfery "przestrzeni biurowej" - prawdopodobnie wszystkie wypełniają również raporty TPS. – JonH

+0

Czy, na marginesie projektu twojego modelu, kontrola dostępu oparta na rolach (http://en.wikipedia.org/wiki/Role-based_access_control) brzmi, jakby pasowała do modelu? Twój tytuł był tak blisko, że zastanawiałem się, czy to właśnie miałeś na myśli. –

+0

@Ninefingers nie, niestety nie jest. rOle oparte na AC i RUle AC mają ten sam akronim, ale są różne i miałem na myśli drugi. W przypadku AC opartego na regułach, zasady dostępu są zdefiniowane w obiekcie (lub zasobie), który ma być zabezpieczony (mówiąc z operacyjnego widoku systemu), dostosowując go do sieci. Najbliższym, co widziałem jest Zend_Acl, implementacja ACL w Zend ramy, ale oczekuje, że załaduję wszystkie uprawnienia, ponieważ jest to rOne, a nie oparte na rUle, zakłada, że ​​będzie to o wiele mniej reguł uprawnień. – svallory

Odpowiedz

1

Co to właściwie ma jedną tabelę z pogrupowanymi uprawnieniami dla pewnych ról i używa innej tabeli dla rozszerzonych uprawnień, które zastąpiłyby ogólne. Jeśli tak jest, to pozwólmy, żeby John miał dostęp do czegoś, po co wspominać o tym, że nie można sobie pozwolić? Podobnie jak w ostatnim przykładzie podanym w powyższym komentarzu: czy istnieje tabela z uprawnieniami. Rekord wygląda następująco: 1645 edit_some_field. Następnie group_permissions wygląda następująco: 1645 everyone false, a ostateczną tabelą wyjątków będzie 1645 (Jane Doe's ID) true.

Jeśli, powiedzmy, że istnieje 50 osób, które mają dostęp do edycji tego pola, a następnie po prostu dodać kolejną grupę w tabeli grupy jak: 89 editors_of_field_X umieścić identyfikatory ludu do tabeli group_members jak 89 (John Smith's ID) true. A następnie na ostatnim etapie możesz zastąpić te z uprawnieniami pojedynczej osoby, jak wspomniałem powyżej. Podsumowując, otrzymasz schemat 3-warstwowy. Wszyscy - grupa-osoba.Im głębiej idziesz, tym większe znaczenie ma ta rola. Na przykład, jeśli wszyscy nie są uprawnieni, ale grupa, w której jesteś, jest dozwolona, ​​możesz edytować coś.

Ponadto, jeśli nie masz uprawnień dostępu na poziomie trzeciej osoby, to znowu stałeś się wyjątkiem w grupie. W ten sposób będziesz mógł ponownie korzystać z grup na później, dodając jedynie drobne zmiany.

+0

Co się stanie, jeśli jedna osoba jest członkiem dwóch grup, a jedna może edytować, a druga nie? – wchargin

+0

Dobra uwaga. Pozostaje jednak do decyzji autora pytania: albo niedozwolony, albo dozwolony lub sprawdzający najnowszy. –

+0

Hej, @ AndriusNaruševičius, dzięki za poświęcenie czasu na odpowiedź z tak dużą ilością szczegółów. Ponieważ projekty mają ostateczny termin (minęło 20 dni, odkąd poprosiłem), więc poszedłem dalej i wdrożyłem opisany przeze mnie model. A więc, coś w tym stylu, tak. Wprowadziłem pewne ulepszenia. Na przykład. nie ma sensu definiować użytkownika podczas definiowania relacji z obiektem. Napiszę coś o tym, co wymyśliłem i zamieszczę tutaj później. Jeśli chodzi o twoją odpowiedź, będę o tym później mówić, ale w zasadzie opisałeś, jak działa kontrola dostępu oparta na rOle. – svallory

1

John utworzył zamówienie i chce, aby Bob go zobaczył.

+0

Zapisałeś gdzieś, że bob został zaproszony do wyświetlenia tej kolejności (dzięki temu system jest w stanie ocenić relację "zaproszony" w czasie wykonywania, tak jak ma to miejsce w przypadku każdej relacji) i dodać STOPRules (użytkownik, zadanie, typ_obiektu, uprawnienie, relacja) wartości (null, "view", "order", "allow", "invite"). Doszedłem do wniosku, że ustawienie użytkownika jest przydatne tylko w przypadku wyjątków. Dobry przykład! – svallory

Powiązane problemy