如何从控制器获取xsrf令牌?

时间:2016-05-15 22:50:36

标签: java spring spring-mvc spring-security spring-security-oauth2

如何更改下面的代码以成功将XSRF标记的新值填充到Spring MVC控制器中的变量中?

下面的当前代码抛出空指针错误。 java.lang.NullPointerException: null at demo.TwoFactorAuthenticationController.auth(TwoFactorAuthenticationController.java:44),它指向以下代码中的sessionToken.getToken()声明:

以下是控制器的相关部分:

@Controller
@RequestMapping(TwoFactorAuthenticationController.PATH)
public class TwoFactorAuthenticationController {
    private static final Logger LOG = LoggerFactory.getLogger(TwoFactorAuthenticationController.class);
    public static final String PATH = "/secure/two_factor_authentication";
    public static final String ROLE_TWO_FACTOR_AUTHENTICATED = "ROLE_TWO_FACTOR_AUTHENTICATED";
    public static final String DEFAULT_CSRF_TOKEN_ATTR_NAME = HttpSessionCsrfTokenRepository.class.getName().concat(".CSRF_TOKEN");//test

    @RequestMapping(method = RequestMethod.GET)
    public String auth(HttpServletRequest request, HttpSession session, HttpServletResponse resp/*, ....*/) {
        CsrfToken sessionToken = (CsrfToken) request.getSession().getAttribute(DEFAULT_CSRF_TOKEN_ATTR_NAME);
        System.out.println(sessionToken.getToken());
        resp.addCookie(new Cookie("XSRF-TOKEN", sessionToken.getToken()));
        return "pinCode"; // Show the form to enter the 2FA secret
    }
    return "pinCode";
}

//other stuff

}

我需要在控制器中获取Session XSRF令牌的原因是/oauth/authorize端点只是在重定向到此GET /secure/two_factor_authentication控制器方法之前在服务器上重新设置XSRF令牌。因此,XSRF的浏览器版本与控制流程中此简短点的服务器版本不同。 换句话说,此时控制流中的request xsrf token is different from the session xsrf`令牌。我想从控制器cookie重新设置浏览器版本,以便避免在后续步骤中使用无效的XSRF证书。我想在服务器端控制器中重新设置,而不是依靠每个客户端来实现自己的新cookie的GET。

那么如何更改上面的代码才能在控制器中成功获取新的会话xsrf令牌?

0 个答案:

没有答案