Hoà*_*ong 2 java security spring spring-mvc spring-security
我正在使用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>
Run Code Online (Sandbox Code Playgroud)
在/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;
}
Run Code Online (Sandbox Code Playgroud)
在SecurityContext设置之前调用该方法,因此它是检查交换机有效性的最佳位置.
| 归档时间: |
|
| 查看次数: |
4415 次 |
| 最近记录: |