當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
实现权限控制_Spring自定义注解+AOP实现权限控制
生活随笔
收集整理的這篇文章主要介紹了
实现权限控制_Spring自定义注解+AOP实现权限控制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文轉載于 SegmentFault 社區
作者:錦城
前言
作業系統在測試過程中出現了學生修改路由可以到達教師界面并且可以使用教師功能的問題,學生不用任何工具就可以修改自己的成績,真的挺要命的,這就要用權限管理進行控制了。
由于沒有接觸過權限管理,所以一開始也是有點懵,后來應用到實踐中,發現也還可以吧。
自定義注解@Admin
如果在實現方式上去描述自定義注解,其實就是接口+注解package club.yunzhi.workhome.annotation;import java.lang.annotation.*;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Admin { String value() default "";}@TARGET
- 用于標注這個注解放在什么地方,類上,方法上,構造器上
- ElementType.METHOD 用于描述方法
- ElementType.FIELD 用于描述成員變量,對象,屬性(包括enum實例)
- ElementType.LOCAL_VARIABLE 用于描述局部變量
- ElementType.CONSTRUCTOR 用于描述構造器
- ElementType.PACKAGE 用于描述包
- ElementType.PARAMETER 用于描述參數
- ElementType.TYPE 用于描述類,接口,包括(包括注解類型)或enum聲明
@Retention
- 用于說明這個注解的生命周期
- RetentionPolicy.RUNTIME 始終不會丟棄,運行期也保留該注解。因此可以使用反射機制來讀取該注解信息。
- 我們自定義的注解通常用這種方式
- RetentionPolicy.CLASS 在類加載的時候丟棄,在字節碼文件的處理中有用。注解默認使用這種方式
- RetentionPolicy.SOURCE 在編譯階段丟棄,這些注解在編譯結束后就不再有任何意義,所以他們不會寫入字節碼中
- @Override,@SuppressWarnings都屬于這類注解。
- 我們自定義使用中一般使用第一種
- java過程為 編譯-加載-運行
@Documented
- 將注解信息添加到文本中
這樣就有了一個自定義注解,但是要想定義它的作用,就需要AOP了。
AOP
基本概念
- AOP(Aspect Oriented Programming)稱為面向切面編程,在程序開發中主要用來解決一些系統層面上的問題,比如日志,事務,權限等待,Struts2的攔截器設計就是基于AOP的思想,是個比較經典的例子。
- 在不改變原有的邏輯的基礎上,增加一些額外的功能。代理也是這個功能,讀寫分離也能用aop來做。
- AOP可以說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入封裝、繼承、多態等概念來建立一種對象層次結構,用于模擬公共行為的一個集合。不過OOP允許開發者定義縱向的關系,但并不適合定義橫向的關系,例如日志功能。日志代碼往往橫向地散布在所有對象層次中,而與它對應的對象的核心功能毫無關系對于其他類型的代碼,如安全性、異常處理和透明的持續性也都是如此,這種散布在各處的無關的代碼被稱為橫切(cross cutting),在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。AOP技術恰恰相反,它利用一種稱為"橫切"的技術,剖解開封裝的對象內部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊之間的耦合度,并有利于未來的可操作性和可維護性。
- 使用"橫切"技術,AOP把軟件系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似,比如權限認證、日志、事物。AOP的作用在于分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。
相關概念
- 橫切關注點:對哪些方法進行攔截,攔截后怎么處理,這些關注點稱之為橫切關注點
- Aspect(切面):通常是一個類,里面可以定義切入點和通知
- JointPoint(連接點):程序執行過程中明確的點,一般是方法的調用。被攔截到的點,因為Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構造器
- Advice(通知):AOP在特定的切入點上執行的增強處理,有before(前置),after(后置),afterReturning(最終),afterThrowing(異常),around(環繞)
- Pointcut(切入點):就是帶有通知的連接點,在程序中主要體現為書寫切入點表達式
- weave(織入):將切面應用到目標對象并導致代理對象創建的過程
- introduction(引入):在不修改代碼的前提下,引入可以在運行期為類動態地添加一些方法或字段
- AOP代理(AOP Proxy):AOP框架創建的對象,代理就是目標對象的加強。Spring中的AOP代理可以使JDK動態代理,也可以是CGLIB代理,前者基于接口,后者基于子類
- 目標對象(Target Object): 包含連接點的對象。也被稱作被通知或被代理對象。
通知類型
- Before:在目標方法被調用之前做增強處理,@Before只需要指定切入點表達式即可
- AfterReturning:在目標方法正常完成后做增強,@AfterReturning除了指定切入點表達式后,還可以指定一個返回值形參名returning,代表目標方法的返回值
- AfterThrowing:主要用來處理程序中未處理的異常,@AfterThrowing除了指定切入點表達式后,還可以指定一個throwing的返回值形參名,可以通過該形參名來訪問目標方法中所拋出的異常對象
- After:在目標方法完成之后做增強,無論目標方法時候成功完成。@After可以指定一個切入點表達式
- Around:環繞通知,在目標方法完成前后做增強處理,環繞通知是最重要的通知類型,像事務,日志等都是環繞通知,注意編程中核心是一個ProceedingJoinPoint
由于初次接觸AOP,對部分概念還不太理解,也就不展開解釋了,以后有機會再寫吧。
@Aspect@Componentpublic class AdminAspect { private static final Logger logger = LoggerFactory.getLogger(AdminAspect.class); @Autowired WorkService workService; @Pointcut(value = "@annotation(club.yunzhi.workhome.annotation.Admin)") public void annotationPointCut() { } @Before("annotationPointCut()") public Object doBefore(ProceedingJoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String methodName = signature.getMethod().getName(); System.out.println("方法名:" + methodName); if(!validate()){ throw new AccessDeniedException("無操作權限"); } try { return joinPoint.proceed(); } catch (Throwable throwable) { return null; } } private boolean validate(){ System.out.println(this.workService.isTeacher()); return this.workService.isTeacher(); }}@Aspect : 將當前類標識為一個切面@Component :讓Spring容器掃描到。@Pointcut :定義切點這樣一來自定義注解就有了靈魂了,驗證到當前角色不是教師,那就拋出異常,否則執行加上注解的方法
以編輯學生為例:
/** * 更新學生信息 * @param id * @param student */ @PutMapping("{id}") @Admin @JsonView(studentJsonView.class) public void update(@PathVariable Long id, @RequestBody Student student) { studentService.update(id, student); }教師:
學生:
總結:
一開始感覺挺難的,后來實踐了才發現還可以,還是不能眼高手低,認為難的不一定難,總會有解決的辦法的。
-?END -
總結
以上是生活随笔為你收集整理的实现权限控制_Spring自定义注解+AOP实现权限控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 义乌中心医院有充电瓶车的吗?
- 下一篇: html中怎么用js把表格清空_一款简洁