2017-01-17 3 views
1

Derzeit überprüfe ich in den meisten meiner Controller-Klassen, ob die Sitzung für jedes Mapping existiert.Spring MVC - Korrekter Weg für Sitzungsvalidierung

Zum Beispiel:

@Controller 
@RequestMapping("/admin") 
public class AdminController{ 

@GetMapping 
public ModelAndView admin(HttpSession session){ 
if(exists(session)){ 
... 
} 
} 

@GetMapping("/addUser") 
public ModelAndView user(HttpSession session){ 
if(exists(session)){ 
... 
} 
} 

@GetMapping("/addBook") 
public ModelAndView book(HttpSession session){ 
if(exists(session)){ 
... 
} 
} 

Gibt es eine Möglichkeit i Sitzung überprüfen, sobald die Admincontroller genannt wird, anstatt Sitzung für jede Zuordnung zu prüfen?

Antwort

2

Wenn Sie können, wechseln Sie zunächst zu Spring Boot. Die Konfiguration wird dann einfacher.

Ja, in Ihrer WebSecurityConfigurerAdapterImpl können Sie angeben, dass der Benutzer eine bestimmte Rolle haben muss, um auf bestimmte Bereiche zuzugreifen. In Ihrem Fall wäre es

sein
http 
    .antMatches("/admin/**").hasRole(<UserRole.Admin>); 

Sie auch PreAuthorize verwenden können:

@Controller 
@RequestMapping("/admin") 
public class AdminController{ 
    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    @GetMapping 
    public ModelAndView admin(HttpSession session){ 

    } 
    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    @GetMapping("/addUser") 
    public ModelAndView user(HttpSession session){ 

    } 
    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    @GetMapping("/addBook") 
    public ModelAndView book(HttpSession session){ 

    } 

} 

Sie haben mit dieser Anmerkung zu ermöglichen. Es ist frei in der Documentation.

Also zusammenfassend, müssen Sie Spring Security, dann entweder Zugang in WebSecurityConfigurerAdapter konfigurieren oder Annotation-basierte Zugriffskontrolle ermöglichen und dann die @PreAuthorize angeben.

Edit:
OK, da die OP zur Klärung gebeten hat, habe ich beschlossen, über die Verwendung von Spring Security einige allgemeinere Informationen hinzuzufügen.

In Spring Security basieren wir auf UserDetails und UserDetailsService, die bei der Anmeldung UserDetails zurückgibt. Obwohl, ich empfehle Ihnen, Ihren Code zu refaktorieren und nur eine Klasse User zu haben, die eine Collection von authorities hat, können Sie das folgende tun.

Erstellen Sie eine neue Klasse, die UserDetailsImpl wäre, die UserDetails implementieren würde. Erstellen Sie auch einige benutzerdefinierte Rollen wie ROLE_USER, ROLE_ADMIN. Sie sollten ein enum sein. Dann in Ihrem UserDetailsImpl haben Felder, die während der Sitzung wichtig sind - geloggte Benutzer-UUID, Name, E-Mail und einige irgendwie von der Schnittstelle erforderlich - isAccountLocked, isPasswordExpired etc, Auch Sie brauchen eine Sammlung von Behörden, die Sie von einem bestimmten zurückgeben werden Methode.

Sie können dann hasRole in Ihrem Code verwenden. Was ist cool, Sie können auch die protokollierten Benutzerdetails in Ihrer Anwendung aus dem Kontext abrufen.

+0

Ich habe keine Instanzvariable/enum als Rolle. Login-Objekt hat Benutzer-ID. Bei der Anmeldung überprüfe ich, ob das Benutzerobjekt (das von db abgerufen wurde) eine Instanz der Klasse Admin ist, und leite es dann entsprechend weiter. Kann ich mit diesem Ansatz etwas Ähnliches machen? –

+1

@ShashankRaghunath ok, das Thema ist ziemlich weit, aber ich werde es für Sie in der Antwort in einer Minute beschreiben – xenteros

3

Wenn Sie Spring Security nicht einbeziehen möchten, können Sie einen Interceptor hinzufügen, der alle Anfragen abfängt.

public class SessionCheck extends HandlerInterceptorAdapter { 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     return exists(request.getSession()); 
    } 
} 
Verwandte Themen