我正在使用具有3个不同角色的Spring Security制作一个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动作(即targetUrl)中,我再次进行检查:如果用户角色是SuperSupporter且他是模拟的人,则应用程序会将他发送到/j_spring_security_exit_user(因为SuperSupporter不需要模拟
他自己)。

尽管它看起来可行,但是我担心恶意用户可能会找到一种方法来解决此问题,从而使我们的系统处于危险之中。

我认为SpringSecurity也许可以解决这一需求,但仍然无法找到它。这样真的安全吗? DivisionSupporter可以解决我当前解决方案中的SuperSupporter问题吗?

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

任何帮助,将不胜感激。

最佳答案

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

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

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之前将调用该方法,因此这是对开关的有效性进行任何检查的最佳位置。

关于java - Spring Switching User:仅允许具有特定角色的用户切换到具有特定角色的另一个用户,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9109453/

10-10 07:26