springboot經過AOP和自定義註解實現權限校驗

自定義註解java

PermissionCheck:spring

package com.mgdd.sys.annotation; import java.lang.annotation.*; /** * @author LWW * @site www.lww.com * @company * @create 2019-12-16 14:08 */

// 標註這個類它能夠標註的位置
@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE}) // 標註這個註解的註解保留時期
@Retention(RetentionPolicy.RUNTIME) // 是否生成註解文檔
@Documented public @interface PermissionCheck { //自定義角色值,若是是多個角色,用逗號分割。
    public String role() default ""; }

aop切面類,切到自定義註解PermissionCheck上,當方法上加了註解就會跳進來進行邏輯處理數據庫

PermissionCheckAspect:apache

package com.mgdd.sys.aspect; import com.mgdd.sys.annotation.PermissionCheck; import com.mgdd.sys.service.PermissionService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; /** * @author LWW * @site www.lww.com * @company * @create 2019-12-16 14:20 */ @Aspect @Component @Slf4j public class PermissionCheckAspect { @Resource private PermissionService permissionService; //切入點表達式決定了用註解方式的方法切仍是針對某個路徑下的全部類和方法進行切,方法必須是返回void類型
    @Pointcut(value = "@annotation(com.mgdd.sys.annotation.PermissionCheck)") private void permissionCheckCut(){}; //定義了切面的處理邏輯。即方法上加了@PermissionCheck
    @Around("permissionCheckCut()") public Object around(ProceedingJoinPoint pjp) throws Throwable{ log.info("====================進入AOP============================"); //1.記錄日誌信息
        Signature signature = pjp.getSignature(); String className = pjp.getTarget().getClass().getSimpleName(); String methodName = signature.getName(); log.info("className:{},methodName:{}",className,methodName); //2.角色權限校驗
        MethodSignature methodSignature = (MethodSignature)signature; Method targetMethod = methodSignature.getMethod(); if (targetMethod.isAnnotationPresent(PermissionCheck.class)){ //獲取方法上註解中代表的權限
            PermissionCheck permission =targetMethod.getAnnotation(PermissionCheck.class); String role =permission.role(); log.info("當前接口請求的用戶角色role:{}",role); if(StringUtils.isNotEmpty(role)){ String[] roles = role.split(",");//接口容許的角色
                List<String> list = Arrays.asList(roles); //根據id從數據庫中查詢管理員權限(可用前臺傳過來的id做爲參數)
                List<String> listPermission = permissionService.queryPermission(1); //打印管理員權限
                log.info("管理員擁有的權限:"+String.valueOf(listPermission)); //將註解上標明的權限與查出來的權限進行比對
                for (String l : list){ if(!listPermission.contains(l)){ log.error("沒有權限"); return null; } } log.info("AOP權限角色校驗經過,進入業務層處理!"); //3.執行業務邏輯,放行
                return pjp.proceed(); } } return "O(∩_∩)O哈哈~"; } }

運用,在方法上面加上註解就行app

/** * 分頁查詢 * * @param params 請求參數集 * @return 結果集封裝對象 */ @GetMapping("queryPager") @PermissionCheck(role = "sys:user:view") public PageUtils queryPager(@RequestParam Map<String, Object> params) { Query query = new Query(params); List<Permission> list = permissionService.queryPager(query); return new PageUtils(list, query.getTotal()); }

效果:spa

相關文章
相關標籤/搜索