2011-11-30 4 views
8

W wersji 3.0 bezpieczeństwa, mamy klasę AuthenticationProcessingFilter, w której używaliśmy metody determineTargetUrl(), która zwróciła adres URL na podstawie różnych ról.określa docelowy adres URL na podstawie ról w ochronie wiosennej 3.1

Teraz idziemy do wiosny 3.1.0.RC3 bezpieczeństwa i jestem zakleszczony w jaki sposób należy teraz ustalić adres URL w oparciu o różne role jako AuthenticationProcessingFilter klasa została usunięta z nowej wersji. Czy ktoś może mi podać krótki opis z jakimś kodem, aby zaimplementować filtr niestandardowy, aby przekierować na różne strony dla różnych ról.

Odpowiedz

19

Najlepszym sposobem ustalenia adresu URL na podstawie ról jest określenie adresu docelowego w konfiguracji Spring Security, jak pokazano poniżej. To będzie działać wiosną 3.0 lub 3.1

<http> 
    ... 
    <form-login login-page="/login" default-target-url="/default"/> 
</http> 

Następnie utwórz kontroler, który przetwarza adres URL domyślnego celu. Sterownik powinien przekierowywać lub przekazywać dalej na podstawie zwojów. Poniżej znajduje się przykład użycia Spring MVC, ale dowolny typ kontrolera zadziała (tj. Struts, Servlet itp.).

@Controller 
public class DefaultController { 
    @RequestMapping("/default") 
    public String defaultAfterLogin(HttpServletRequest request) { 
     if (request.isUserInRole("ROLE_ADMIN")) { 
      return "redirect:/users/sessions"; 
     } 
     return "redirect:/messages/inbox"; 
    } 
} 

Zaletą tego podejścia jest to nie jest połączony z żadną konkretną realizację Bezpieczeństwa, nie jest dołączony do każdej konkretnej implementacji MVC i działa z łatwością konfiguracji przestrzeni nazw Wiosna Bezpieczeństwa. Pełny przykład można znaleźć w projekcie SecureMail, który zaprezentowałem na SpringOne w tym roku.

Alternatywą jest możliwość utworzenia niestandardowego AuthenticationSuccessHandler. Implementacja może rozszerzyć SavedRequestAwareAuthenticationSuccessHandler, który jest domyślnym AuthenticationSuccessHandler. następnie można go podłączyć za pomocą przestrzeni nazw, jak pokazano poniżej.

<sec:http> 
    <sec:form-login authentication-success-handler-ref="authSuccessHandler"/> 
</sec:http> 
<bean:bean class="example.MyCustomAuthenticationSuccessHandler"/> 

nie polecam robić to jak to jest związane z Wiosna Bezpieczeństwo API i lepiej tego uniknąć, jeśli to możliwe.

Powiązane problemy