model bazy danych z użytkownikami, rolami i uprawnieniami
<p>mam model bazy danych z tabelą użytkowników i tabelą ról. chcę kontrolować dostęp (uprawnienia) do 10 różnych elementów. dostęp można przyznać roli lub jednemu użytkownikowi. poniżej znajduje się definicja użytkowników, ról i przedmiotów w tabeli:</p><pre><code>create table users ( id serial not null primary key, username character varying unique, password character varying, first\_name character varying, last\_name character varying, ... ); create table roles ( id serial not null primary key, name character varying not null, description character varying, ... ); create table element\_1 ( id serial not null primary key, name character varying not null, description character varying, ... ); ... </code></pre><p>teraz mam dwa różne sposoby projektowania praw. jedna tabela z kolumną typu uprawnień lub 10 tabel uprawnień - po jednym dla każdego elementu, do którego chcę kontrolować dostęp.</p><p><strong>jakie są zalety i wady jednej tabeli uprawnień w porównaniu do jednej tabeli uprawnień na element? - czy jest to bardziej odpowiedni sposób na zrobienie tego?</strong></p>
<p>po pierwsze, jaki typ modelu bezpieczeństwa planujesz wdrożyć? kontrola dostępu oparta na rolach (rbac) czy dyskrecjonalna kontrola dostępu (dac)?</p><blockquote> <p>rbac w modelu kontroli dostępu opartej na rolach (rbac) dostęp do zasobów zależy od roli przypisanej użytkownikowi. w tym modelu administrator przypisuje użytkownika do roli, która ma pewne określone prawa i uprawnienia. ze względu na powiązanie użytkownika z rolą użytkownik może uzyskać dostęp do niektórych zasobów i wykonywać określone zadania. rbac jest również znany jako niedyskrecjonalna kontrola dostępu. role przypisane do użytkowników są administrowane centralnie.</p> <p>dac w modelu dyskretnej kontroli dostępu (dac) dostęp do zasobów zależy od tożsamości użytkownika. użytkownik otrzymuje uprawnienia do zasobu poprzez umieszczenie go na liście kontroli dostępu (acl) powiązanej z zasobem. wpis na liście acl zasobu jest znany jako wpis kontroli dostępu (ace). gdy użytkownik (lub grupa) jest właścicielem obiektu w modelu dac, użytkownik może udzielić uprawnienia innym użytkownikom i grupom. model dac opiera się na własności zasobów.</p> </blockquote><p> <a href="http://www.webune.com/forums/differences-between-mac-dac-and-rbac.html">patrz źródło</a> </p><p>1) w rbac: potrzebujesz tabeli elementtype, aby przypisać prawa do roli (użytkownicy są przypisani do ról). rbac definiuje: „co może zrobić ta rola/użytkownik”. administrator przypisuje prawa do ról i uprawnienia do ról, przypisuje użytkowników do ról w celu uzyskania dostępu do zasobów. 2) w dac: użytkownicy i role mają prawa do elementów poprzez listę kontroli dostępu (własność). dac definiuje: „kto ma dostęp do moich danych”. użytkownik (właściciel) udziela uprawnień do posiadanego zasobu.</p><p>w dowolny sposób sugeruję ten model danych:</p><pre><code>create table elementtype ( id (pk) name ... ) create table elementbase ( id (pk) type (fk to elementtype) ... ) </code></pre><p>(relacja jeden do jednego)</p><pre><code>create table element\_a ( id (pk, fk to elementbase) ... ) create table element\_b ( id (pk, fk to elementbase) ... ) </code></pre><p>1) rbac (relacja wiele do wielu)</p><pre><code>create table elementtype\_to\_role\_rights ( rightid (pk) roleid (fk to role) elementtypeid (fk to elementtype) ... ) </code></pre><p>2) dac (relacja wiele do wielu)</p><pre><code>create table elementbase\_to\_actor\_rights ( rightid (pk) elementbaseid (fk to elementbase) actorid (fk to actor) ... ) create table actor ( id (pk) name ) create table user ( id (pk, fk to actor) password ... ) create table role ( id (pk, fk to actor) ... ) </code></pre>
Po pierwsze: Tak, to jest coś, co należy do Wniosku o dokładnie określonym reson: Co się dzieje po nowe profile użytkowników są tworzone? Oczywiście, jeśli używasz domeny jest możliwe, aby mieć jakiś materiał umieścić w rejestrze stworzenia, ale to naprawdę nie jest przypadek użycia. Wniosek powinien sprawdzić, czy istnieją seetings i jeśli nie korzystać z ustawień domyślnych.


Mając na uwadze powyższe, możliwe jest, aby zmienić Inni użytkownicy Keys przez HKEY\_USERS ula.


Nie mam doświadczenia z Visual Studio 2003 projektu instalacji, więc tutaj jest trochę (całkowicie niezwiązanego) kod VBScript, że może po prostu dać ci pomysł, gdzie szukać:



```
const HKEY_USERS = &H80000003
strComputer = "."
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = ""
objReg.EnumKey HKEY_USERS, strKeyPath, arrSubKeys
strKeyPath = "\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing"
For Each subkey In arrSubKeys
    objReg.SetDWORDValue HKEY_USERS, subkey & strKeyPath, "State", 146944
Next

```

(Kod uprzejmości [Jeroen Ritmeijer](http://jritmeijer.spaces.live.com/blog/cns!8A48A27460FB898A!965.entry) ) Użyj edycję programu Visual Studio do bazy danych skryptu z bazą danych. Działa jak czar i można użyć dowolnego systemu kontroli źródła, oczywiście najlepiej, jeśli ma wtyczek VS. Narzędzie posiada również szereg innych przydatnych funkcji. Sprawdź je tutaj, w tym wielkim poście


<http://www.vitalygorn.com/blog/post/2008/01/Handling-Database-easily-with-Visual-Studio-2008.aspx>


lub sprawdzić MSDN dla oficjalnej dokumentacji Cóż, jeden z reaons dlaczego zajęcia zazwyczaj zawierają członków prywatnych z publicznymi pobierające / ustawiające jest dokładnie ponieważ mogą zweryfikować dane.


Jeśli masz numer niż może wynosić od 1 do 100, na pewno umieścić coś w seter, że sprawdza, a następnie może rzucić wyjątek, który jest złowionych przez kod. Powód jest prosty: jeśli nie rób tego w seter, trzeba pamiętać, że od 1 do 100 ograniczenie każdym razem, gdy go ustawić, co prowadzi do kodu duplikaty lub gdy go zapomnieć, prowadzi do nieprawidłowym stanie.


Jeśli chodzi o wydajność, jestem z Knuth tutaj:



> 
> „Powinniśmy zapomnieć o małej wydajności, powiedzmy około 97% czasu. Przedwczesna optymalizacja jest źródłem wszelkiego zła”
> 
> 
> Z ograniczeniem, że klauzula warunek może być „coś”, to jesteś ograniczony do skanowania całą listę i stosując warunek.


Jeśli istnieją ograniczenia dotyczące klauzuli stan, wtedy można spojrzeć na organizowanie danych do bardziej efektywnie obsługiwać zapytań.


Na przykład, przykładowy kod z „byFirstLetter” słowniku nie pomaga w ogóle z „endswith” zapytania.


Więc tak naprawdę sprowadza się do tego, co pyta chcesz zrobić przed tymi danymi.


W bazach danych, problem ten jest ciężar „optymalizator zapytań”. W typowej bazy danych, jeśli masz bazę danych bez indeksów, oczywiście każde zapytanie będzie skan tabeli. Jak dodać indeksów w tabeli, optymalizator może użyć tych danych do bardziej wyrafinowanych zapytań planuje lepiej dostać się do danych. To w istocie problem, który opisujesz.


Gdy masz bardziej konkretny podzbiór typów kwerend następnie można zrobić lepszą decyzję, co struktura jest najlepsza. Ponadto, należy wziąć pod uwagę ilość danych. Jeśli masz listę 10 elementów każdy mniej niż 100 bajtów, skan wszystko może okazać się najszybciej, co można zrobić, ponieważ masz taką małą ilość danych. Oczywiście, że nie skaluje się do elementów 1M, ale nawet sprytnych technik dostępu nosić koszt w instalacji, konserwacji (jak utrzymanie indeksu) i pamięć.


**EDIT** , na podstawie komentarza


Jeśli jest to auto Nieukończenie, jeśli dane są statyczne, a następnie posortować je i używać przeszukiwanie binarne. Nie jesteś naprawdę dzieje się szybciej niż to.


Jeśli dane są dynamiczne, a następnie zapisać go w zrównoważonym drzewie, i szukać tego. To skutecznie wyszukiwanie binarne, a to pozwala zachować dodać dane losowo.


Coś jeszcze jest jakaś specjalność na tych pojęć. To naprawdę zależy od rodzaju danych, które zabierasz powrotem. Ponieważ zbiór danych (w efekcie) tylko zbiór DataTable obiektów, można zwracać wiele różnych zestawów danych w jednym, a więc łatwiejsze, obiektu. 


Performance-mądry, jesteś bardziej prawdopodobne, aby uzyskać nieefektywność z zapytaniami niezoptymalizowanych niż z „niewłaściwym” wybór .NET konstruktu. Przynajmniej tak było moje doświadczenie. to wiem. podałem tylko przykład komendy zwiększającej priorytet.

chcę automatycznie uruchomić program z wyższym priorytetem, docelowo jako zwykły użytkownik.

zastanawiam się, czy można by było np. uruchomić go jak w przykładzie, a potem (jakoś?) automatycznie zmienić użytkownika z root’a na zwykłe… źle zrozumiałem problem, myślałem, że chcesz rozciągnąć w poziomie - mój błąd. 

dane mogą zostać w tabeli, ale dolne menu robiłbym już w nav>ul>li, również nie robiłbym breadcrumbsów u góry w tabeli. 
wracając już do problemu, będziesz miał trochę ciężko to zrobić. wydaje mi się, że najlepiej będz… ło panie. dobra. jeśli używasz entity framework, to wybierz wszystko, co jest w danej tabelce do zmiennej (i już masz dane 2 cache). sprawdzasz ile masz tam danych metodą count dostępną dla list. robisz tablicę dynamiczną i wrzucasz tam dane podzielone z listy. zwykły for od 0 do tego, ile zwróciło … Obie alternatywy, które zostały wskazane ma wady i zalety, decyzja zależy od tego jak to plusy i minusy wpływa na aplikację:



> 
> Pobrać wszystkie wartości z bazy danych przy użyciu zwykłego PHP następnie przechowywać je w zmiennej JavaScript, później szukać sekund rozwijanej listy (jeśli wartość pierwszej rozwijanej liście na zmiany wartości) w zmiennej JavaScript (array).
> 
> 
> 


Plusy:


* Minimalizuje petycje http, trzeba tylko jedną prośbę, aby odzyskać całość danych.
* Minimalizuje kwerenda jest potrzebne w bazie danych, na ogół tylko wykonać jedno zapytanie.


Cons:


* Zwiększa ilość pamięci używanej jeśli masz duże ilości danych.
* Jeśli dane zmienia się nieustannie, użytkownicy nie widzą zmian aż odświeżyć całą stronę.



> 
> Jeśli pierwszy rozwijanej liście zmian wartości jest następnie pobrać wartości dla drugiej listy rozwijanej z bazą danych za pomocą technologii AJAX (jQuery).
> 
> 
> 


Plusy:


* Nie trzeba do przechowywania wszystkich danych w pamięci całych jedynie dane, które zostaną wykorzystane, co zmniejsza ilość potrzebnej pamięci.
* Twoje dane są aktualizowane za każdym razem, bez konieczności przeładowania strony tylko zmieniając wybór.


Cons:


* Trzeba wykonać kilka petycji HTTP i biegnie querys z bazą danych przy każdej zmianie wyboru.


Osobiście preferuję metodę 2, jeśli ilość danych jest stosunkowo duża i wydajność nie jest koniecznością. druga pewnie jest dla sprawdzenia poprwanosci odpowiedzi, kucze nie pamietam dokladnie tych komend ale sprobuj skopjowac je z tej gotowej tabelki i ewentualnie cos pozmieniaj- a dokladniej t wspolrzedne pol zeby sie zgadzaly (wstaw tylko w pierwszych ramkach a reszte zlap za jeden rog i przeciagnij to ci sie skopiuje dla innych wynikow)