zoukankan      html  css  js  c++  java
  • spring oauth重复点击授权后报错Cannot approve uninitialized authorization request

    原文及更多文章请见个人博客:http://heartlifes.com

    现象:

    在网络环境特别差等环境下,用户如果重复点击授权按钮,会导致spring报错:
    Cannot approve uninitialized authorization request

    原因:

    AuthorizationEndpoint类中,有一行代码:

     finally {
        sessionStatus.setComplete();
    }
    

    sessionStatus标记了spring-security的session生命周期状态,当标记为session生命周期结束后,spring会调用sessionAttributesHandler.cleanupAttributes(request)方法,去清除spring-security上下文请求。对应到oauth的话,这个请求就是放在上下文请求map中的authorizationRequest对象,这个对象封装了authorize接口所用到的请求参数,如appid,redirect_uri,scope等,如果这个对象被从spring-security上下文请求中清掉了,那么整个oauth的流程自然也就断了

    解决:

    1.限制授权按钮,只能点击一次,这是治本的方法,从源头限制用户多次点击的可能性
    2.修改后台,将authorizationRequest手动传到session用户请求上下文中(spring-security请求上下文和用户的session上下文是不同的),再从session中获取authorizationRequest,这是治标的方法,即使用户重复点击了,oauth流程还是能继续执行

    model.put("authorizationRequest", authorizationRequest);
    HttpSession session = request.getSession();
    session.setAttribute("authRequest", authorizationRequest);
    return getUserApprovalPageResponse(model, authorizationRequest);
    
    if (authorizationRequest == null) {
        HttpSession session = request.getSession();
        Object obj = session.getAttribute("authRequest");
        if (obj != null) {
            authorizationRequest = (AuthorizationRequest) obj;
           }
    }
    
  • 相关阅读:
    python 字符串替换
    python 字符串截取
    python 字符串连接
    PHP 做群发短信(短信接口连接问题)
    Yii dropDownList 下拉菜单 联动菜单
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    SQL Server 2008 R2——分组取前几名
    SQL Server 分组后取Top N
    大型网站架构系列:20本技术书籍推荐
    较主流的消息队列的比较与选型
  • 原文地址:https://www.cnblogs.com/heartlifes/p/6970984.html
Copyright © 2011-2022 走看看