2012-01-19 9 views
6

Znalazłem naprawdę elastyczny framework bezpieczeństwa Apache Shiro. Pomyślnie zaimplementowałem uwierzytelnianie i autoryzację za pomocą Shiro.Kontrola dostępu na poziomie instancji w Apache Shiro

Jedną z atrakcyjnych funkcji architektury jest bezpieczeństwo oparte na instancjach. Właśnie skopiowałem przykład ze strony Shiro.

Następujące uprawnienia są przechowywane w bazie danych.

printer:query:lp7200 
printer:print:epsoncolor 

Poniższy kod sprawdza, czy dla danej instancji drukarki aktualny uwierzytelniony użytkownik ma pozwolenie czy nie.

if (SecurityUtils.getSubject().isPermitted("printer:query:lp7200") { 
// Return the current jobs on printer lp7200 
} 

Moje pytanie brzmi: "Czy w ten sposób przechowywane są uprawnienia w bazie danych?" Czy istnieje lepszy sposób przechowywania uprawnień opartych na instancji?

Proszę dać mi znać.

Dzięki

Odpowiedz

9

Jak przechowywać ta informacja jest całkowicie do Ciebie. Twoja implementacja Realm jest odpowiedzialna za zapytanie o dowolne źródło danych, z którego korzystasz i wyodrębnianie danych uprawnień w preferowanym formacie.

Niektóre osoby przechowują je jako ciągi bezpośrednio (jak te pokazane w przykładzie), inne osoby przechowują je w dedykowanej tabeli (np. W przypadku używania RDBMS) (np. Uprawnienie_typ, cel, kolumna działań). Możesz powiązać uprawnienia do ról lub bezpośrednio do użytkowników lub grup, które są przypisane do użytkowników, itp. - jednak ma to sens dla twojej aplikacji.

Twoje opcje przechowywania zależą wyłącznie od Ciebie. Dane są zmaterializowane, ale chcesz zapewnić działanie operacji Realm.isPermitted(...) zgodnie z oczekiwaniami.

Zamiast wdrażania bezpośrednio metody Realm.isPermitted(...), wiele osób uważa, że ​​bardziej wygodne do podklasy klasy abstrakcyjnej AuthorizingRealm i zastąpić metodę doGetAuthorizationInfo i powrócić AuthorizationInfo instancje obsługujące reprezentacje uprawnień.

W tej metodzie można wysłać zapytanie do magazynu danych, przetłumaczyć zwrócone dane na instancje AuthorizationInfo i gotowe (nie zapomnij włączyć buforowania autoryzacji - zobaczysz dużą korzyść z wydajności).

Zastępowanie tych RealmisPermitted metody jest konieczne tylko, jeśli chcesz bardzo specyficzną kontrolę nad zapytaniami itp