Spring MVC i Hibernate listowanie rekordów do których user ma dostęp

0

Hej,
pytanko, nie wiem za bardzo czy coś takiego jest bezpośrednio w Hibernate. Mam zaawansowaną logikę sprawdzania uprawnień, np. Admin może zobaczyć wszystkie obiekty, User może zobaczyć swoje obiekty oraz obiekty stworzone przez Userów których stworzył on sam :). Zagmatwane trochę ale tak ma być. I teraz pytanko czy na poziomie Hibernate da sie wylistować wszystkie obiekty do których powinienem mieć uprawienie? czy moze musze normalnie listowac wszystkie obiekty, iterować po nich i sprawdzać czy mam uprawnienie zgodnie z logiką zaprezentowaną powyżej. Pytanie czy da się to zrobić na poziomie Hibernate czy jakoś inaczej.

I jeszcze pytanko. Mam na przyklad akcje w kontrolerze "/invoice/detail/73" gdzie 73 to invoice_id. Czy da się jakoś tak zrobić abym w metodzie która obsluguję tą akcję miał dostępny od razu ten obiekt Invoice czy musze normalnie odpalać InvoiceService i pobrać jego definicje z DB.

dzieki

0

Co do pierwszego paragrafu - hasła "multitenancy", "tenant", "multitenant" pomogą. Jednym z rozwiązań może być trzymanie userId w twojej encji bazodanowej. Wówczas filtrowanie możesz przeprowadzić na poziomie bazy danych z odpowiednim WHERE'm (HQL, Native Query, Criteria API)

Co do drugiego paragrafu - oczywiście że w momencie wejścia do metody nie masz całego obiektu, tylko jego id (sama architektura twoja to wymusza). Normalnym jest, że go teraz zaciągniesz z bazy.

0

Przede wszystkim zależy gdzie i jak masz egzekwowane te uprawnienia. Czy to jest z poziomu bazy danych czy javy? To co opisujesz zalatuje mi ACL (AccessControlList), a jak tak to na 99% istnieje jakaś tabela która np za pomocą np klucza obcego łączy ci obiekty z uprawnieniami, w takiej sytuacji jesteś w domu bo wystarczyłoby to pobrać. Jeżeli masz w jakiś sposób definiowane to javovo np springowe ACL'ki to raczej powinno byc jakieś api do tego(zgaduje, nigdy nie korzystałem).

Co do pobierania obiektu to po pierwsze, wywal ten link bo aż w oczy boli. Jakbym zobaczył coś takiego /invoice/detail/73 od razu bym powiedział ze w aplikacji masz jeden invoice i wiele detail i pobierasz detail o id 73. Bardziej intuicyjne jest /invoice/73/details. A jeżeli chodzi o pytanie to @Pinek ma racje z małym wyjątkiem, jak masz obiekty w pamieci trzymane albo w jakis sposób cachowane to prawdopodobnie mozesz pobrać w jakiś inny sposób niż przez uderzanie do bazy. Ale wątpię zeby cos takiego miało miejsce ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1