Spędziłem cały dzień na wyszukiwaniu i szukaniu różnych pytań tutaj, próbując wymyślić najlepsze rozwiązanie do wdrożenia uwierzytelniania i autoryzacji. Znalazłem część rozwiązania teraz, ale mam nadzieję, że ktoś może wypełnić luki. Zdaję sobie sprawę, że jest dużo tekstu poniżej, ale proszę pokrywa się ze mną: o)JSF: Uwierzytelnianie i autoryzacja, najlepsza droga do przodu
Tle
mam odziedziczyła część wypełnionego wniosku CRM która obecnie używa JSF 2.0, JavaEE 6, WZP i PostgreSQL Baza danych. Niestety, ludzie, którzy początkowo budowali tę aplikację internetową w swojej nieskończonej mądrości, zdecydowali, że najlepiej będzie pozostawić uwierzytelnienie/autoryzację do końca - teraz muszę to wprowadzić.
Wniosek jest zasadniczo podzielony na trzy warstwy - widoki, zarządzana fasola i DAO. Oznacza to, że zarządzane ziarna są szczególnie "grube", ponieważ zawierają całą logikę biznesową, walidację i logikę nawigacji.
wymagania uwierzytelniania/autoryzacji
- formularze oparte uwierzytelniania, weryfikacji oparciu o dane przechowywane w bazie danych PostgreSQL.
- Jedyną stroną, która będzie publicznie dostępna (przez anonimowych użytkowników), będzie strona logowania.
- Muszę uniemożliwić dostęp do niektórych obszarów aplikacji w zależności od roli użytkownika. Na przykład tylko użytkownicy z rolą "Administrator" powinni mieć dostęp do strony tworzenia/edytowania użytkownika.
- Potrzebuję również mieć możliwość ograniczenia dostępu do niektórych obszarów strony. Na przykład użytkownik z rolą "Przedstawiciel handlowy" powinien móc wyświetlić szczegóły dotyczące klientów, ale przycisk Zapisz/edytuj powinien być wyświetlany tylko wtedy, gdy użytkownik ma rolę "Obsługa klienta".
Gdzie jestem na
Pierwszą rzeczą, jaką planujesz robić to do tej User Authentication and Authorization using JAAS and Servlet 3.0 Login przykład. Uważam, że spełni moje pierwsze 3 wymagania.
Aby pokazać/ukryć przyciski zapamiętywania itp. Na stronach, mogę skorzystać z techniki opisanej w artykule this SO answer. To częściowo rozwiąże wymaganie 4, jednak uważam, że nadal muszę zabezpieczyć metody działania i lub zarządzane ziarna. Na przykład chciałbym móc dodać adnotację lub coś do metody save() w komponencie bean klienta, aby zapewnić, że tylko użytkownicy z rolą "Customer Service" mogą ją nazwać - tutaj zaczynam napotykać problemy .
Myślę, że jedną z opcji byłoby zrobienie czegoś podobnego do tego, co proponuję zrobić w widoku i użycie faceContext, aby sprawdzić, czy bieżący użytkownik "jest w roli". Nie przepadam za tym, bo to po prostu zaśmieje mój kod i wolałbym zamiast tego używać adnotacji. Gdybym jednak podążał tą drogą, w jaki sposób zwrócę stan http 403?
Adnotacje javax.annotation.security. * Wydają się być dobrym rozwiązaniem do deklaratywnego definiowania dostępu do obszarów aplikacji, jednak z tego co rozumiem, mogą być dodawane tylko do komponentów EJB. To oznaczałoby, że musiałbym przenieść całą logikę biznesową z zarządzanych komponentów, tam gdzie aktualnie znajduje się w nowych EJB. Sądzę, że miałoby to dodatkową zaletę, polegającą na oddzieleniu logiki biznesowej od jej własnego zestawu klas (delegatów, usług lub cokolwiek innego, jak je nazwiesz).Byłby to jednak dość duży reaktor, który nie będzie wspomagany brakiem testów jednostkowych lub testów integracyjnych. Nie jestem pewien, czy odpowiedzialność za kontrolę dostępu powinna również spoczywać na tym nowym poziomie usług - myślę, że powinno to być na zarządzanych ziarnach.
Inne alternatywy
podczas moich badań znalazłem wiele osób wymieniających ram takich jak wiosny i szew. Mam pewne ograniczone doświadczenie z Seamem, myślę, że byłby odpowiedni dla tego projektu i z tego, co pamiętam, uważam, że rozwiązuje problemy z autoryzacją, które mam, ale myślę, że jest już za późno, aby wprowadzić go teraz .
Widziałem również Shiro wspomniano w różnych miejscach. Po spojrzeniu na 10 minute tutorial wyglądało to na dobre dopasowanie, zwłaszcza w połączeniu z Deluan Quintao's taglib, ale nie byłem w stanie znaleźć żadnych tutoriali lub przykładów, jak zintegrować go z aplikacją internetową JSF.
Inną alternatywą, z którą zetknąłem się zaskakująco regularnie, jest wdrożenie niestandardowego rozwiązania - wydaje mi się to szalone!
Podsumowanie
Podsumowując więc, naprawdę chciałbym pewne wskazówki dotyczące tego, czy jadę w dół właściwą drogę w zakresie realizacji uwierzytelniania i autoryzacji oraz w jaki sposób wypełnić tym brakującym elementem zabezpieczającym osoby metody i/lub zarządzany fasoli (lub przynajmniej kod oni przekazać) i/lub w jaki sposób można ręcznie zwrócić stanu HTTP 403.
> Nie udało mi się znaleźć żadnych samouczków ani przykładów, jak zintegrować go z aplikacją internetową JSF. - Jest jeden, ale nadal nie jest idealny: http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html –