2017-07-12 12 views
5

Używamy sprężyny i sprężyny bezpieczeństwa-3.2. Niedawno dodajemy adnotacje @PreAuthorize do RestAPIs (wcześniej był oparty URL).Niestandardowy komunikat o błędzie z @Preauthorize i @@ ControllerAdvice

 @PreAuthorize("hasPermission('salesorder','ViewSalesOrder')") 
    @RequestMapping(value = "/restapi/salesorders/", method = RequestMethod.GET) 
    public ModelAndView getSalesOrders(){} 

Mamy już Globalny obsługi wyjątków, które opatrzone - @ControllerAdvice i niestandardowych PermissionEvaluator w miejscu, wszystko działa dobrze, z wyjątkiem komunikatu o błędzie.

Powiedzmy, że niektórzy użytkownicy uzyskują dostęp do API W chwili obecnej bez pozwolenia "ViewSalesOrder", domyślnie wiosna domyślnie zgłasza wyjątek "Odmowa dostępu", ale nie powiedział, które pozwolenie nie istnieje (Jest to nasz wymóg, aby wskazać, które pozwolenie jest brakujący).

Czy można rzucić wyjątek, który również zawiera nazwę uprawnienia, więc ostateczny komunikat o błędzie powinien wyglądać tak: "Odmowa dostępu, potrzebujesz uprawnienia ViewSalesOrder" (tutaj nazwa uprawnienia powinna pochodzić z @ adnotacji autoryzacji)?

Należy pamiętać, że mamy 100 takich restAPI w miejscu, więc ogólne rozwiązanie będzie bardzo cenione.

Odpowiedz

0

Nie ma łatwego sposobu osiągnięcia tego, czego się spodziewać, ponieważ interfejs PermissionEvaluator nie pozwala na przekazanie brakującego pozwolenia wraz z wynikiem oceny.
Ponadto, na ostateczną autoryzację decyduje AccessDecisionManager w odniesieniu do głosów instancji AccessDecisionVoter, z których jedna to PreInvocationAuthorizationAdviceVoter, która głosuje w odniesieniu do oceny wartości @PreAuthorize.

Krótko mówiąc, PreInvocationAuthorizationAdviceVoter głosów przeciw żądaniu (z prośbą -1 punkt), gdy niestandardowe PermissionEvaluator zwraca false do hasPermission połączenia. Jak widzisz, nie ma sposobu, aby propagować przyczynę niepowodzenia w tym przepływie.

Z drugiej strony możesz spróbować obejść, aby osiągnąć to, co chcesz.

Jednym ze sposobów może być zgłoszenie wyjątku w niestandardowym PermissionEvaluator, gdy sprawdzanie uprawnień zakończy się niepowodzeniem. Możesz użyć tego wyjątku do propagowania brakujących uprawnień do globalnej procedury obsługi wyjątków. Tam możesz przekazać brakujące pozwolenie do deskryptorów komunikatów jako parametr. Pamiętaj, że to zatrzyma proces wykonywania AccessDecisionManager, co oznacza, że ​​kolejni wyborcy nie zostaną zrealizowani (domyślne wartości to RoleVoter i AuthenticatedVoter). Powinieneś być ostrożny, jeśli zdecydujesz się pójść tą drogą.

Innym bezpieczniejszym, ale bardziej zwartym sposobem może być zaimplementowanie niestandardowego AccessDeniedHandler i dostosowanie komunikatu o błędzie przed udzieleniem odpowiedzi 403. AccessDeniedHandler zapewnia bieżące HttpServletRequest, które można wykorzystać do pobrania identyfikatora URI żądania. Jednak w tym przypadku złą wiadomością jest to, że do identyfikowania uprawnień potrzebny jest identyfikator URI w celu zlokalizowania brakującego pozwolenia.

Powiązane problemy