2016-05-22 1 views
1

У меня есть метод Спринг службы аннотированный с @PreAuthorize:Vaadin 7 + Spring Загрузочной безопасность Ручка доступ обедали исключения

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

Когда я пытаюсь открыть этот метод из кода с не авторизованным пользователем Я получаю AccessDeniedException:

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

это абсолютно хорошо.

В этом случае мне нужно переслать этого пользователя на страницу входа в систему.

Как это сделать в Vaadin 7 + Spring Security?

ответ

2

В пользовательском интерфейсе пользовательского интерфейса ErrorHandler, который имеет дело с catching AccessDeniedException (брошен в любом месте приложения), отменяет сеанс и перенаправление.

@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; 
    } 
}