【问题标题】:Spring MVC Security Token based Authentication基于 Spring MVC 安全令牌的身份验证
【发布时间】:2017-03-21 02:58:25
【问题描述】:

任何人都可以在这方面帮助我。 我被指派保护现有的 Web 应用程序。

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

这是我们现在使用的。 1) 弹簧安全

<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() 方法中创建一个随机令牌并将其存储在会话中。
  • 从session中获取变量,并在jsp中放入隐藏变量
  • 当用户执行任何操作时,将隐藏变量与值一起传递给控制器​​作为请求参数。
  • 在控制器/过滤器中从会话中获取随机值并从请求参数中获取隐藏值。现在比较一下。如果匹配,则进行正常操作,否则抛出错误页面。

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

你能帮我解决一下吗?提前致谢

【问题讨论】:

  • 您是否尝试使用站点管理器?并实施单点登录?您不需要显式处理会话变量。
  • @JerinJoseph:刚刚更新了这个问题以及我正在考虑如何解决这个问题。请您再看一遍。

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


【解决方案1】:

我通过使用Spring CSRF 解决了上述问题。我在实施 CSRF 时遇到了一个问题。问题是 CSRF 正在创建 2 个令牌。找到根本原因需要很长时间(至少 1 天)。根本情况是我试图在我的 Fiter 中获取 csrf 令牌值并使用下面的代码打印它。因此,一旦我写了 request.getAttribute("_csrf"),它就会创建一个新令牌。所以我只是从我的 csrf 中删除了以下几行,只是做了上面 spring csrf 链接中描述的操作。成功了

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

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2017-07-10
    • 2020-03-03
    • 2013-02-11
    • 2020-02-04
    • 2016-12-18
    相关资源
    最近更新 更多