2016-05-22 6 views
1

ich eine Feder Service-Methode mit @PreAuthorize kommentiert habe:Vaadin 7 + Frühling Boot Security Griff Zugang Gespeist Ausnahmen

@Override 
@PreAuthorize("hasAuthority('PERMISSION_CREATE_DECISION')") 
public Decision createProduct(String name, String description, String url) 

Wenn ich versuche, diese Methode von Code für den Zugriff mit nicht autorisierten Benutzern I AccessDeniedException bin Empfang:

org.springframework.security.access.AccessDeniedException: Access is denied 
    at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:83) 

das ist absolut in Ordnung.

In diesem Fall muss ich diesen Benutzer auf die Anmeldeseite der Anwendung weiterleiten.

Wie macht man das in Vaadin 7 + Spring Security?

Antwort

2

In der UI-Klasse benutzerdefinierte ErrorHandler festlegen, die sich mit dem Abfangen von AccessDeniedException beschäftigt (an beliebiger Stelle in der Anwendung ausgelöst), Session und Umleitung ungültig macht.

@SpringUI 
public class CustomUI extends UI { 

    @Override 
    protected void init(final VaadinRequest request) { 
     setErrorHandler(new CustomErrorHandler()); 
    } 
} 

public class CustomErrorHandler implements ErrorHandler { 

    @SuppressWarnings("ThrowableResultOfMethodCallIgnored") 
    @Override 
    public void error(ErrorEvent event) { 
     Throwable finalCause = getFinalCause(event.getThrowable()); 
     if (AccessDeniedException.class.isAssignableFrom(finalCause.getClass())) { 
      // do everything you need 
      UI.getCurrent().getSession().close();     //close Vaadin session 
      UI.getCurrent().getSession().getSession().invalidate(); //close Http session 
      UI.getCurrent().getPage().setLocation("/login");  //redirect.. 
      UI.getCurrent().getNavigator().navigateTo("viewName");  //... or using navigator 
      return; 
     } 

     DefaultErrorHandler.doDefault(event); 
    } 

    private Throwable getFinalCause(Throwable throwable) { 
     while (throwable.getCause() != null) { 
      throwable = throwable.getCause(); 
     } 
     return throwable; 
    } 
}