2012-04-17 36 views
5

Aktualnie pracuję nad małą witryną Pythona za pomocą Pyramid.
Ale nie wiem, jak zaprojektować system uprawnień.
System powinien być bardzo elastyczny: muszę ustanowić połączenia między wieloma różnymi tabelami.
Zamiast sekretarzyk jedno uprawnienie dla każdego wariantu pomyślałem wystarczy utworzyć jedną tabelę - ja to nazywam PermissionCollection:Najlepsza praktyka projektowania systemu uprawnień

PermissionCollection:

  • permissionCollectionId - PrimaryKey
  • onType = ENUM ("USER", "nauczyciel", "Grupa", "kurs" ...)
  • onId = Integer

i tabela Permission:

  • permissionId - PrimaryKey
  • klucz
  • wartość
  • permissionCollectionId - ForeignKey

będę definiować standardowe PermissionCollections dla każdej możliwej relacji zakodowane w źródłach i jeśli użytkownik, oczywiście , nauczyciel ... ma specjalne prawa, utworzę nową PermissionCollection i doda do niej uprawnienia.

Jestem bardzo nowy w programowaniu stron internetowych i nie wiem, czy takie podejście jest przydatne. Lub jeśli coś takiego jeszcze istnieje. Myślę, że ACL Pyramid nie jest odpowiednim narzędziem do tego zadania, prawda?

+0

Większość RDBMSs posiada '/' polecenie GRANT' REVOKE' który jest używany, aby umożliwić dostęp (na różnych poziomach) do tabel/schematów w bazie danych. Niektóre z nich mają nawet pojęcie grup użytkowników, co oznacza, że ​​można wykonać polecenie dla całej grupy. Możesz więc próbować coś zrobić na poziomie aplikacji, który jest już obecny na poziomie bazy danych (który byłby o wiele bezpieczniejszy). –

+0

Ale czy nie jest GRANT dla użytkowników mojej bazy danych? I użytkownik mojej aplikacji nie oznacza użytkownika bazy danych –

+0

'GRANT' _jest_ dla użytkowników bazy danych, tak. Ale jeśli napisałeś swoją aplikację, aby sprawdzić uprawnienia (na podstawie tego, kto/co zalogował się do aplikacji), możesz równie dobrze zalogować się jako konkretny użytkownik bazy danych (zwykle możesz to dostarczyć w ciągu połączenia). Co pomogłoby w audycie, a także w kontrolowaniu dostępu. –

Odpowiedz

4

Nie jestem pewien, czy czytasz o tym już, ale piramida ma bardzo ładny system uprawnień. Autoryzacja przy użyciu listy ACL.

Jak sobie z tym poradzić, tak naprawdę to tylko zależy od Ciebie ... Można mieć tabeli ACL

(object_id pozwalają/zaprzeczyć, kto? (Grupa, userid), pozwolenie, porządek)

  • object_id to unikatowy identyfikator do rekordu w bazie danych
  • pozwalają/zaprzeczyć, co to jest ACE ma robić ... zezwolić lub odmówić dostępu
  • kto? Jest też grupa, nazwa użytkownika lub cokolwiek chcesz na przykład system.everyone jest każdy
  • uprawnienie jest parametrem zezwolenie w view_config
  • zamówienie jest jedna ważna rzecz ma znaczenia kolejność

Na przykład

__acl__ = [ 
(Deny, Everyone, 'view'), 
(Allow, 'group:admin', 'view') 
] 

próbka ta będzie zawsze zaprzeczyć widok nawet dla administratora ... tak szybko, jak piramida znaleźć coś, co mówi, czy można zobaczyć, czy nie pojawi się zapis automatycznie zatrzymać wyszukiwanie

__acl__ = [ 
(Allow, 'group:admin', 'view'), 
(Deny, Everyone, 'view') 
] 

Umożliwi to widok dla każdego administratora, ale nie dla nikogo innego.Dlatego musisz pamiętać o kolejności swoich ACE.

Fajna część jest tutaj. To wszystko jest dobre. Masz acl zmapowany do rekordu w twoich danych. Kiedy ładujesz na przykład stronę ... Będziesz musiał załadować acl i ustawić je w swoim obiekcie.

myobject.__acl__ = load_acls(myobject) 

Jeśli masz drzewa danych. Możesz nawet nie ustawić acls.

Na przykład masz stronę, która wygląda tak

root 
    \--pages with acl 
     +---- page1 without acl 
     \---- page2 with acl 

Kiedy masz dostęp PAGE1 będzie sprawdzać ACL jeśli nie może go znaleźć, to sprawdzenia rodzic jeśli rodzic ma acl, sprawdza uprawnienia do niego, jeśli nie, sprawdzi, czy jego rodzic rodzic, aż dojdziesz do roota. Jeśli nie może znaleźć pozwolenia, nie jestem pewien, co się stanie. Przypuszczam, że da ci to niedozwolony błąd lub błąd predykatu. Że nie może znaleźć właściwego widoku.

To powiedziawszy, aby móc wykonać tę pracę, musisz wykonać obiekt świadomy lokalizacji, który zna ich rodziców.

Ale dlaczego miałbyś robić to wszystko?

Możesz mieć acl dla dowolnego obiektu i mieć naprawdę drobną kontrolę nad tym, kto może oglądać, czy nie każdy obiekt w bazie danych. Możesz również umieścić acl bezpośrednio w swoim obiekcie klasy bez bazy danych.

tak długo, jak twój acl jest w atrybucie acl piramida będzie w stanie coś z nim zrobić. Nie jest ważne, jak to zrobiłeś.

to sprawdzić

http://pyramid.readthedocs.org/en/1.3-branch/tutorials/wiki/authorization.html

+0

Nice. Dziękuję Ci. Mogę też użyć mojego stołu? W swoim podejściu: w jaki sposób aplikacja może dowiedzieć się, kto: 1 oznacza użytkownika z identyfikatorem 1 jedną grupę o identyfikatorze 1? Tak więc, po prostu napisałem funkcję, która generuje tę krotkę acl dla każdego elementu w drzewie przejścia. Czy mogę po prostu załadować acl w contructor? –

+0

Jaki jest cel oder? –

+0

Tak, możesz ładować acl w dowolnym miejscu, dopóki instancja jako __acl__ ustawiona jest na listę krotek (ACE). –

Powiązane problemy