spring oauth重复点击授权后报错Cannot approve uninitialized

本文转自我的博客,转载请申明地址:http://www.heartlifes.com/archives/8/

现象:###

在网络环境特别差等环境下,用户如果重复点击授权按钮,会导致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;
       }
}

转载于:https://my.oschina.net/u/2420155/blog/481215

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值