Vaadin 7 + Spring Boot Security处理Access Dined异常

时间:2016-05-22 16:50:57

标签: spring spring-security spring-boot vaadin vaadin7

我有一个用Private Sub lstGames_SelectedIndexChanged(sender As Object, e As EventArgs) Dim gameName As String = lstGames.SelectedItem.ToString() ' show appropriate data 注释的Spring服务方法:

@PreAuthorize

当我尝试从未经授权的用户的代码访问此方法时,我收到了AccessDeniedException:

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

绝对没问题。

在这种情况下,我需要将此用户转发到应用程序登录页面。

如何在Vaadin 7 + Spring Security中做到这一点?

1 个答案:

答案 0 :(得分:2)

在UI类中设置自定义ErrorHandler,用于处理捕获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;
    }
}