如何在Spring中使用SwitchUserFilter模仿用户?

Sac*_*-17 9 impersonation spring-mvc spring-security magnolia

我对Spring模拟用户没有任何了解.

我已经通过一些示例代码来模拟用户,并注意到SwitchUserFilter用于此实现.

如何使用Spring SwitchUserFilter Filter实现模拟用户以及它是如何工作的?冒充用户的内部流程是什么?

在我的应用程序中,我也使用spring security.

任何人都可以通过简单的描述或任何示例来帮助我实现这一目标吗?

San*_*jay 22

您首先需要创建一个实例SwitchUserFilter,如下所示:

@Bean
public SwitchUserFilter switchUserFilter() {
    SwitchUserFilter filter = new SwitchUserFilter();
    filter.setUserDetailsService(userDetailsService);
    filter.setSuccessHandler(authenticationSuccessHandler);
    filter.setFailureHandler(authenticationFailureHandler());
    return filter;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以这样添加过滤器:

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
     ...
     .addFilterAfter(switchUserFilter(), FilterSecurityInterceptor.class);
Run Code Online (Sandbox Code Playgroud)

现在,要切换,你可以使用

GET /login/impersonate?username=loginIdOfTheNewUser
Run Code Online (Sandbox Code Playgroud)

并切换回来

GET /logout/impersonate
Run Code Online (Sandbox Code Playgroud)

请注意,确保现有用户必须拥有足够的交换机权限是您的职责.通常的做法可能是/login/impersonate仅限制为ADMINs,以及/logout/impersonate经过身份验证的用户,如下所示:

        .authorizeRequests()
            .antMatchers("/login/impersonate*").hasRole("ADMIN")
            .antMatchers("/logout/impersonate*").authenticated()
            .antMatchers("/**").permitAll();
Run Code Online (Sandbox Code Playgroud)

请参阅示例以获取完整示例.

  • 如果您保留“@Bean”,则应用程序上下文中不应有任何实例。(但是如果你在`@Configuration`类中有`@Bean`,Spring就足够聪明,只创建一个实例,即使你调用该方法一次或多次) (3认同)