具有 Spring 安全性的用户模拟

User Impersonation with Spring Security

我正在尝试使用 Spring 安全及其 SwitchUserFilter 实现用户模拟。

当前配置如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/impersonate*").hasRole("Administrator");
    http.addFilter(switchUserFilter());
    super.configure(http);
    setLoginView(http, ViewLogin.class);
}
...
@Bean
public SwitchUserFilter switchUserFilter(){
    SwitchUserFilter filter = new SwitchUserFilter();
    filter.setUserDetailsService(userDetailsService);
    filter.setSwitchUserUrl("/impersonate");
    filter.setSwitchFailureUrl("/switchUser");
    filter.setTargetUrl("/");
    return filter;
}

我试图使用以下方式导航到模拟:

UI.getCurrent().getPage().setLocation("/impersonate?username="+username);

不幸的是,Vaadin 正在尝试导航到页面“/impersonate...”,但没有找到相应的页面并跳过了 SwitchUserFilter。 我将如何强制切换?

如果您使用 setSwitchUserUrl,它将仅匹配 POST 个请求 [1]。 但是您想使用 GET 请求。所以你必须使用像这样的匹配器 这个:

filter.setSwitchUserMatcher(new AntPathRequestMatcher("/impersonate", "GET"));

顺便说一句:您不必 addFilter 过滤器,如果您将其定义为 @Bean.

[1] https://github.com/spring-projects/spring-security/blob/e125a76687d4ca9739cd663eedc107c7ff55e8cf/web/src/main/java/org/springframework/security/web/authentication/switchuser/SwitchUserFilter.java#L513-L515