跟着JHipster学做项目 (9) 处理用户登录超期

22 篇文章 14 订阅
17 篇文章 0 订阅

JHipster登录有Remember Me选项,配置项中不勾选session可以保持24小时,勾选则为10天。

下面讲述一下JHipster对于登录超期的处理方法,这里登陆超期是指JWT的超期。

对于超期有两种情况,一种是对账户进行操作,另一种是非账户操作。前端代码如下:

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      tap(null, (err: HttpErrorResponse) => {
        if (err.status === 401 && err.url && !err.url.includes('api/account')) {
          this.stateStorageService.storeUrl(this.router.routerState.snapshot.url);
          this.loginService.logout();
          this.router.navigate(['']);
          this.loginModalService.open();
        }
      })
    );
  }

由于Vue没有相关处理代码,这里贴出angular代码,基本逻辑是一致的,对于非账户操作会转到登录页面要求用户重新登录。

这里特别指出,后端可能存在无需任何权限的操作,所以当token发生超期时,request依旧会受到后端处理,除非因权限不足返回401错误时,才会跳转到登录页面。

后端的是否超期是通过TokenProvider中的validateToken进行处理:

    public boolean validateToken(String authToken) {
        try {
            Jwts.parserBuilder().setSigningKey(key)
            .build()
            .parseClaimsJws(authToken);
            return true;
        } catch (JwtException | IllegalArgumentException e) {
            log.info("Invalid JWT token.");
            log.trace("Invalid JWT token trace.", e);
        }
        return false;
    }

其中JwtException包含了ExpiredJwtException,当抛出该异常,系统就不会赋予该用户任何权限,JWTFilter中代码如下:

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String jwt = resolveToken(httpServletRequest);
        if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
            Authentication authentication = this.tokenProvider.getAuthentication(jwt);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

最后提到一点,当用户名或者密码输入错误同样会从后端返回401错误,如果需要前端提示不同错误信息,例如:“用户名和密码错误”和“用户登录超时,请重新登录”,这时需要!err.url.includes('api/account')来加以区分。

 

Good Luck,

Cheers!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值