日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用户权限验证的两种方法

發(fā)布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用户权限验证的两种方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

用戶權限驗證

intercept攔截器使用

之前在進行登錄狀態(tài)判斷時用的是intercept攔截器進行攔截處理,配合Jwt生成token,在客戶端發(fā)送請求時檢查請求頭里有無攜帶token,并驗證token是否合法,否則就攔截該請求返回錯誤提示,對登錄狀態(tài)判斷時我覺得使用攔截器比較方便,代碼量少也能實現(xiàn)功能

在配置攔截器里只需將需要攔截的地址添加進去即可

@Configuration public class InterceptConfig implements WebMvcConfigurer {@ResourceInterceptImpl intercept;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(intercept).addPathPatterns("/admin/**") //攔截admin下的所有請求.excludePathPatterns("/admin/login/**"); //設置放行地址}@Overridepublic void addCorsMappings(CorsRegistry registry) {//設置允許跨域的路徑registry.addMapping("/")//設置允許跨域請求的域名.allowedOriginPatterns("*")//是否允許證書 不再默認開啟.allowCredentials(true)//設置允許的方法.allowedMethods("*")//跨域允許時間.maxAge(3600);} }

攔截器實現(xiàn)類繼承HandlerInterceptor接口,實現(xiàn)preHandle,postHandle,afterCompletion方法

在preHandle里寫驗證權限的操作,例如:

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");response.setHeader("Access-Control-Allow-Origin", "*");//在這里聲明需要在header里攜帶的參數(shù),比如tokenresponse.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With,token");response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");if (!(handler instanceof HandlerMethod)) {return true;}JWTUtils.verifyToken(token, String.valueOf(userId),response);return true;}

剩下兩個方法看自己需求,可寫可不寫 ,到這里是不是感覺使用攔截器和jwt配合進行權限驗證非常方便,但也有弊端,例如:當你需要對不同的請求進行不同的驗證時,就好比后臺管理系統(tǒng),不同的用戶能做的操作不同,界面顯示的菜單選項也不同,這是使用aop自定義注解來實現(xiàn)就比較好,總的來說intercept和aop各有千秋

AOP 自定義注解實現(xiàn)

直接說用法吧,網(wǎng)上關于aop的介紹一大堆,(放張圖意思意思)

配置自定義注解:

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.PARAMETER}) //@target里面參數(shù) ElementType.METHOD說明可以用在方法上 ElementType.PARAMETER 可以用在字段上 ElementType.TYPE 可以用在類上 @Retention(RetentionPolicy.RUNTIME) //設置運行時不被丟棄 @Documented //可以被javadoc標注為文檔,可寫可不寫,看自己需求 public @interface TokenCheck {String token() default ""; }

自定義注解使用:

//在方法上使用 @TokenCheck @GetMapping("login/{userName}/{password}") public ResultVo login(@PathVariable String userName,@PathVariable String password){return userService.login(userName, password); } //在字段上使用 @TokenCheck @GetMapping("TokenCheck/{demo}") public ResultVo demoCheck(@TokenCheck @PathVariable String demo) {return userService.TokenCheck(demo); } //兩種用法區(qū)別不大

aop切面攔截功能實現(xiàn):

@Aspect @Component @Order(1) //括號里面數(shù)字代表執(zhí)行順序,當有多個攔截時刻自定義執(zhí)行順序 public class TokenCheck {@Pointcut("@annotation(com.xqj.common.utils.annotation.TokenCheck)")public void check(){}@Around("check()")public Object demoCheck(ProceedingJoinPoint pjp) throws Throwable {/*** 填寫處理注解事務邏輯*/System.out.println("進AoP了!!");Signature signature = pjp.getSignature(); //可以獲取有關包方法的信息RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;HttpServletRequest request = attributes.getRequest(); //獲得HttpServletRequest請求對象,主要用來獲取tokenreturn pjp.proceed(); //放行} }

到這里aop的自定義注解就配置好了,比intercept稍微繁瑣一點

Jwt 的使用

引入依賴

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version> </dependency>

配置jwtUtils類

public class JwtUtils {/*** 簽發(fā)token對象* @param uid* @param userName* @return*/public static String createToken(String uid,String userName){Calendar nowTime = Calendar.getInstance();nowTime.add(Calendar.HOUR,12);Date time = nowTime.getTime();return JWT.create().withAudience(uid).withIssuedAt(new Date()) //發(fā)行時間.withExpiresAt(time) //有效期限.withClaim("userName",userName).sign(Algorithm.HMAC256(uid+"xqj"));}public static void verifyToken(String token, String secret){DecodedJWT jwt = null;try {JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret+"xqj")).build();jwt = verifier.verify(token);} catch (Exception e) {throw new RuntimeException("tokenError");}}/*** 獲取簽發(fā)對象*/public static String getAudience(String token) {String audience = null;try {audience = JWT.decode(token).getAudience().get(0);} catch (JWTDecodeException j) {//這里是token解析失敗throw new RuntimeException();}return audience;}/*** 通過載荷名字獲取載荷的值*/public static Claim getClaimByName(String token, String name){return JWT.decode(token).getClaim(name);} }

到這jwt就可以直接使用了,生成token令牌、驗證令牌合法性等等

博客地址: 徐啟君的個人博客 xqijun.top

總結(jié)

以上是生活随笔為你收集整理的用户权限验证的两种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。