基于Spring MVC安全令牌的身份验证

时间:2016-11-07 17:10:49

标签: spring-mvc spring-security csrf restful-authentication csrf-protection

任何人都可以帮助我。 我被分配来保护现有的Web应用程序。

问题: 当用户已经登录到应用程序(这意味着会话处于活动状态)时,攻击者可以猜测输入字段并保存URL并创建类似页面并发送超链接。如果用户点击该链接,它将不会通过javascript,而是会点击弹簧控制器。由于会话处于活动状态,它会将攻击者数据保存到数据库中。

以下是我们现在使用的内容。 1)Spring Security

<http auto-config="true"> 
    <intercept-url pattern="/**" access="ROLE_ADMIN, ROLE_HR" />
    <custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</http>

<beans:bean id="siteminderFilter" class="com.mywbsite.security.UserFilter">
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="continueFilterChainOnUnsuccessfulAuthentication" value="false"/>
</beans:bean>

当用户第一次登录应用程序时调用此方法

protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {

    String userId = request.getHeader("uid");
    logger.info("<<<<<<<<<<<<<<<<<<<<<userId>>>>>>>>>>>>>>>>>>>>>>> : "+userId);

    return userId;
}

当用户执行任何调用任何控制器/ java

的操作时,将调用此方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    System.out.println(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER));
    logger.info(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER));
    logger.info("Existing the UserFilter.doFilter method...");
}

解决方案: 在控制器/过滤器中,我必须确定请求是来自我的应用程序还是来自其他任何地方。

以下是我正在考虑实施的内容。

  • 在getPreAuthenticatedPrincipal()方法中创建一个随机令牌,并将其存储在会话中。
  • 从会话中获取变量并在jsp
  • 中输入隐藏变量
  • 当用户执行任何操作时,使用值传递隐藏变量并将其作为请求参数传递给控制器​​。
  • 在Controller / Filter中从session获取随机值并从请求参数中获取隐藏值。现在比较。如果匹配,则执行正常操作,否则抛出错误页面。

现在我担心的是,如果我实现上述解决方案,我必须在每个jsp中编写隐藏的变量代码,并在每个请求和请求参数中传递给控制器​​。

你能帮我解决一下这个问题吗?提前致谢

1 个答案:

答案 0 :(得分:0)

我使用Spring CSRF解决了上述问题。我在实施CSRF时遇到了一个问题。问题是CSRF正在创建2个令牌。找到根本原因需要很长时间(至少1天)。根案例是我试图在我的Fiter中获取csrf标记值并使用下面的代码打印它。因此,一旦我转到request.getAttribute(&#34; _csrf&#34;),它就会创建一个新令牌。所以我只是从我的csrf中删除了下面的行,并且刚刚执行了上面的spring csrf链接中描述的内容。它工作

//      CsrfToken token = (CsrfToken) request.getAttribute("_csrf");
//      System.out.println(">>>>>>>>>>UserFilter.getPreAuthenticatedPrincipal() CSRF Token: " + token.getToken());