Spring Switching User:只允许具有特定角色的用户切换到具有特定角色的另一个用户

Posted

技术标签:

【中文标题】Spring Switching User:只允许具有特定角色的用户切换到具有特定角色的另一个用户【英文标题】:Spring Switching User: only allow a user with a specific role switch to another user with specific roles 【发布时间】:2012-02-24 22:30:18 【问题描述】:

我正在使用 Spring Security 制作一个具有 3 个不同角色的 Web 应用程序:

超级支持者 部门支持者 客户

目前我的应用程序允许 SuperSupporter 使用 SwitchUserFilter“冒充”DivisionSupporter,让他充当那个 DivisionSupporter。如果 DivisionSupporter 遇到一些问题 - 并且需要支持,这是必要的。这听起来可能很奇怪,但它有点像使用 TeamViewer 为朋友检查计算机问题。

此外,现在我们需要赋予DivisionSupporter“冒充”客户的权利,以便DivisionSupporter 可以“支持”客户。

但让我担心的是,如果我们授予 DivisionSupporter 访问j_spring_security_switch_user 的权利,恶意的 DivisionSupporter 可能会使用它来冒充 SuperSupporter(通过发布与相应链接的链接)用户名)。

我想了一个办法来阻止这种情况:

 <bean id="switchUserFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter">
        <property name="userDetailsService" ref="userDetailsService" />
        <property name="switchUserUrl" value="/j_spring_security_switch_user" />
        <property name="exitUserUrl" value="/j_spring_security_exit_user" />
        <property name="targetUrl" value="/checkRole.html" />
     </bean>

/checkRole action(即targetUrl)中,我再次检查:如果用户角色是SuperSupporter并且他冒充某人,应用程序会将他发送到/j_spring_security_exit_user(因为SuperSupporter不需要模仿 自己)。

虽然看起来可行,但我担心恶意用户可能会找到绕过这堵墙的方法,从而使我们的系统处于危险之中。

我认为 SpringSecurity 可能有办法解决这个需求,但仍然无法找到它。这种方式真的安全吗? DivisionSupporter 能否使用我当前的解决方案模拟 SuperSupporter?

更重要的是,有没有更好的方法来解决这个问题?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

targetUrl 方法是个坏主意,因为用户可以忽略重定向并请求另一个 URL。您需要首先防止不适当的开关。

您最好的选择可能是在SwitchUserFilter 上自定义attemptSwitchUser 方法:

protected Authentication attemptSwitchUser(HttpServletRequest request) 
    Authentication switchTo = super.attemptSwitchUser(request);
    Authentication currentUser = SecurityContextHolder.getContext().getAuthentication();
    // Inspect currentUser (e.g. authorities) and switchTo to see if valid combination
    // Raise AuthenticationException if not

    return switchTo;

该方法在设置SecurityContext 之前调用,因此它是检查开关有效性的最佳位置。

【讨论】:

【参考方案2】:

使用以下example 来交换使用 Spring Security 的用户。

本节设置应用此功能的主要参数:

@Bean
public SwitchUserFilter switchUserFilter() 
    SwitchUserFilter filter = new SwitchUserFilter();

    filter.setUserDetailsService(defaultUserDetailsService);
    filter.setTargetUrl("/");
    filter.setSwitchUserUrl("/switchuserto");
    filter.setUsernameParameter("username");
    filter.setExitUserUrl("/switchuserlogout");
    filter.setSwitchFailureUrl("/index");

    return filter;

以下字符串将 switchUserFilter 对象添加到HttpSecurity http 对象中:

.addFilter(switchUserFilter())

【讨论】:

以上是关于Spring Switching User:只允许具有特定角色的用户切换到具有特定角色的另一个用户的主要内容,如果未能解决你的问题,请参考以下文章

uplink Tx switching for ENDC/CA

如何允许用户在 Spring Boot / Spring Security 中仅访问自己的数据?

Spring Security - 只允许带有前缀的请求

Spring WebFlux:只允许一个连接接收订阅者

如何只允许经过身份验证(登录)的用户访问 Spring RESTful 服务

Spring Security 不允许资源,登录浏览器后只显示一个 css 文件?