SpringCloud微服务实战——搭建企业级开发框架(二十三):Gateway+OAuth2+JWT实现微服务统一认证授权 (11)

2、自定义OAuth2拦截异常并统一处理

/** * 自定义Oauth异常拦截处理器 */ @Slf4j @RestControllerAdvice public class GitEggOAuth2ExceptionHandler { @ExceptionHandler(InvalidTokenException.class) public Result handleInvalidTokenException(InvalidTokenException e) { return Result.error(ResultCodeEnum.UNAUTHORIZED); } @ExceptionHandler({UsernameNotFoundException.class}) public Result handleUsernameNotFoundException(UsernameNotFoundException e) { return Result.error(ResultCodeEnum.INVALID_USERNAME_PASSWORD); } @ExceptionHandler({InvalidGrantException.class}) public Result handleInvalidGrantException(InvalidGrantException e) { return Result.error(ResultCodeEnum.INVALID_USERNAME_PASSWORD); } @ExceptionHandler(InternalAuthenticationServiceException.class) public Result handleInvalidGrantException(InternalAuthenticationServiceException e) { Result result = Result.error(ResultCodeEnum.INVALID_USERNAME_PASSWORD); if (null != e) { String errorMsg = e.getMessage(); if (ResultCodeEnum.INVALID_PASSWORD_CAPTCHA.getMsg().equals(errorMsg)) { //必须使用验证码 result = Result.error(ResultCodeEnum.INVALID_PASSWORD_CAPTCHA); } else if (ResultCodeEnum.PASSWORD_TRY_MAX_ERROR.getMsg().equals(errorMsg)) { //账号被锁定 result = Result.error(ResultCodeEnum.PASSWORD_TRY_MAX_ERROR); } else if (ResultCodeEnum.DISABLED_ACCOUNT.getMsg().equals(errorMsg)) { //账号被禁用 result = Result.error(ResultCodeEnum.DISABLED_ACCOUNT); } } return result; } }

3、前端登录页面增加判断,默认采用password方式登录,当错误达到一定次数时,必须使用验证码登录

requestFailed (err) { this.isLoginError = true if (err && err.code === 427) { // 密码错误次数超过最大限值,请选择验证码模式登录 if (this.customActiveKey === 'tab_account') { this.grantType = 'captcha' } else { this.grantType = 'sms_captcha' } this.loginErrorMsg = err.msg if (this.loginCaptchaType === 'sliding') { this.$refs.verify.show() } } else if (err) { this.loginErrorMsg = err.msg } }

备注:
一、当验证报401时:
进行 /auth/token 的post请求时,没有进行http basic认证。
什么是http Basic认证?
http协议的一种认证方式,将客户端id和客户端密码按照“客户端ID:客户端密码”的格式拼接,并用base64编码,放在
header中请求服务端。例子如下:
Authorization:Basic ASDLKFALDSFAJSLDFKLASD=
ASDLKFALDSFAJSLDFKLASD= 就是 客户端ID:客户端密码 的64编码
二、JWT一直不过期:
在自定义TokenEnhancer时,将毫秒加入到了过期时间中,在鉴权解析时,OAuth2是按照秒来解析,所以生成的过期时间非常大,导致token一直未过期。

源码地址:

Gitee: https://gitee.com/wmz1930/GitEgg
GitHub: https://github.com/wmz1930/GitEgg

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjgjz.html