美文网首页
Oauth2+JWT续签方案

Oauth2+JWT续签方案

作者: lbjfish | 来源:发表于2020-11-13 18:13 被阅读0次

改造上一篇

改造上一篇登出白名单(为什么要改造,后面说)
DefaultTokenServices.createAccessToken()方法里有个一行代码:

OAuth2AccessToken existingAccessToken = this.tokenStore.getAccessToken(authentication);

因此我们要去CustomJwtTokenStore自定义类,重写该方法,参照上一篇白名单方法三,把下面这段代码移除,放到前面重写的类方法中,源码会判断,如果有,则直接返回token,不懂的看源码createAccessToken()方法。

if(!StringUtils.isEmpty(tokenByteStr)){
                byte[] tokenByte = Base64.getDecoder().decode(tokenByteStr);
                DefaultOAuth2AccessToken tokenSource = (DefaultOAuth2AccessToken) deserializeAccessToken(tokenByte);

                //对象默认传递是引用传递,要改变整个对象。如果直接写 token = tokenSource; 是不行的,因为这不能改变对象的指针,默认拿到的还是之前的对象
                //想改变对象里面值,有两种办法,1.直接set属性(但是这样一个一个set比较麻烦) 2.直接深复制,就是下面这句话
                BeanUtils.copyProperties(tokenSource, accessToken);
            }

解决登录单参数,使用PIN多参数

  1. 复制并改造类UserDetailsByNameServiceWrapper,主要是改该类loadUserDetails()方法,内容是读loadUserByPIN()方法。而loadUserDetails()方法中T authentication参数需要改造类AuthJwtAccessTokenConverter,塞入用户信息,代码如下:
@Override
            public Authentication extractAuthentication(Map<String, ?> map) {
                if (map.containsKey("user_info")) {
                    Object principal = map.get("user_info");
                    //  Collection<? extends GrantedAuthority> authorities = getAuthorities(map);
                    LoginAppUser loginUser = new LoginAppUser();
                    if (principal instanceof Map) {
                        loginUser = BeanUtil.mapToBean((Map) principal, LoginAppUser.class, true);
                    }
                    return new UsernamePasswordAuthenticationToken(loginUser, "N/A", loginUser.getAuthorities());
                }
                return super.extractAuthentication(map);
            }

完结。

注意

上面这个方法extractAuthentication()有个问题,map里没有userId那个附加信息,需要改类TokenGranterConfig,注释掉:

//    @Autowired(required = false)
//    private List<TokenEnhancer> tokenEnhancer;

加入:

    @Autowired(required = false)
    private JwtAccessTokenConverter jwtAccessTokenConverter;
    @Autowired
    private TokenEnhancer tokenEnhancer;

然后这个方法,改成如下:

private TokenEnhancer tokenEnhancer() {
        if (tokenEnhancer != null) {
            TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
            tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer, jwtAccessTokenConverter));
            return tokenEnhancerChain;
        }
        return null;
    }

相关文章

  • Oauth2+JWT续签方案

    改造上一篇 改造上一篇登出白名单(为什么要改造,后面说)DefaultTokenServices.createAc...

  • 续签

    『房子还续签吗?房租涨50.』尖耳的声音从电话中飘了出来。

  • Spring Cloud Oauth2 JWT 实现

    本文是基于上一篇 Spring Cloud OAuth2 token存数据库实现 ,改造为oauth2+jwt;源...

  • 鉴峰丨放弃,永远都不要放弃自己

    鉴峰自我管理 [连续签到第1253天] 2019-10-25 周五 Don’t give up 没有完成的方案和不...

  • 0120-2019周检视

    一、健康一周三跑17㎞二、家庭家庭亲子跑三、事业客户新方案1个,改方案2个,续签合同1个四、财富 五、成长简书日更...

  • 续签巴黎

    第一次到法国,竟然要去警局~不是有什么事,而是为了没事…… 突发的新冠肺炎,成为席卷全国的疫情,形势之严峻史无前例...

  • 求职记‖政府法律顾问的难处

    顾问单位的合同即将到期,续签时想提价,但是遇到诸多阻拦,各种方案都存在拦路虎,风险。此时,真不是靠专业可...

  • 鉴峰丨死结,引入外部解决方案

    鉴峰自我管理 [连续签到第 419天] 2019-3-2 周六 什么是死结? 即解决方案就是问题本身。 你想通过创...

  • 续签合同

    文/原创 北京自6月上旬出现第二波病毒疫情以来,针对性地提升了突发公共卫生事件的应急响应等级。集中收养体弱...

  • 续签合同

    工作十来年了,在这家公司续签了合同,我之前的公司都干了2-3年就跑了。原因差不多都是觉得干着太累了,看不惯领导,或...

网友评论

      本文标题:Oauth2+JWT续签方案

      本文链接:https://www.haomeiwen.com/subject/tisdvktx.html