Spring AOP 實現用戶權限驗證


軟件152 楊浩藝

 

每個項目都會有權限管理系統

無論你是一個簡單的企業站,還是一個復雜到爆的平台級項目,都會涉及到用戶登錄、權限管理這些必不可少的業務邏輯。有人說,企業站需要什么權限管理阿?那行吧,你那可能叫靜態頁面,就算這樣,但你肯定也會有后台管理及登錄功能。

每個項目中都會有這些幾乎一樣的業務邏輯,我們能不能把他們做成通用的系統呢?

AOP 實現用戶權限驗證

從零開始學 Java - Spring AOP 攔截器的基本實現這篇文章中,我詳細的寫了什么是 AOP ? 、 AOP 主要能實現什么功能?

AOP 在實際項目中運用的場景主要有權限管理(Authority Management)、事務管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和調試管理(Debugging)等。

所以,權限驗證正好我們可以使用 AOP 來直接實現。具體你項目中權限怎么管理,管理的粒度是什么級別這些完全取決於項目需要,這里完全不做任何的討論。

先說思路:利用自定義注解及攔截器來在你需要的時候,進行你需要的一些權限認證。這里依然涉及到的有enum(枚舉)annotation(自定義注解)及攔截器相關知識,廢話不多說,直接開寫代碼。

開始擼一下代碼

**一、建立AuthorityType.java枚舉類

public enum AuthorityType { // 登錄和權限都驗證 默認 Validate, // 不驗證 NoValidate, // 不驗證權限 NoAuthority; }

這個枚舉類的作用,依然是使自定義注解用起來爽到還想要。

二、新建Authority.java自定義注解類

import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface Authority { // 默認驗證 AuthorityType value() default AuthorityType.Validate; } 

三、再建一個AuthorityAnnotationInterceptor.java

/** * 權限認證攔截器 * */ public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) handler; Class<?> clazz = hm.getBeanType(); Method m = hm.getMethod(); try { if (clazz != null && m != null) { boolean isClzAnnotation = clazz.isAnnotationPresent(Authority.class); boolean isMethondAnnotation = m.isAnnotationPresent(Authority.class); Authority authority = null; // 如果方法和類聲明中同時存在這個注解,那么方法中的會覆蓋類中的設定。 if (isMethondAnnotation) { authority = m.getAnnotation(Authority.class); } else if (isClzAnnotation) { authority = clazz.getAnnotation(Authority.class); } int code = -1; String msg = ""; if (authority != null) { if (AuthorityType.NoValidate == authority.value()) { // 標記為不驗證,放行 return true; } else if (AuthorityType.NoAuthority == authority.value()) { // 不驗證權限,驗證是否登錄 // TODO: return true; } else { // 驗證登錄及權限 // TODO: code = 1; msg = "驗證成功!"; return true; } } // //跳轉 // String url = ""; // response.getWriter().write("<script>top.location.href='" // + url + "'</script>"); // return false; // 未通過驗證,返回提示json Map<String, Object> responseMap = new HashMap<String, Object>(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", ""); String json = new Gson().toJson(responseMap); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); response.getWriter().write(json); return false; } } catch (Exception e) { } } return false; } }

這個類的目的就是在打過Authority標簽的方法及類上,進行權限認證。我這里分了三種類型:全部驗證、只驗證登錄、不驗證用來滿足我們的業務需求。

這里的返回值可以是 JSON 串,也可以是跳轉到相應的頁面,來實現你想要的效果。

四、配置攔截器

<mvc:interceptors> <!-- 權限認證攔截器 --> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="cn.mayongfa.interceptor.AuthorityAnnotationInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>

/WebContent/WEB-INF/springMVC-servlet.xml文件下的<mvc:interceptors>節點配置就行,這里可以配置具體要攔截的 Url 。

到這里就完成了權限驗證的工作了,如何使用呢?

使用就非常簡單

因為我們的攔截器配置,然后我們在自定義注解的默認是驗證,所以,我們只需要在類名及方法名上打標簽就可以。

當然,你完全是可以在攔截器中設置默認就驗證所有請求的,接着設置不驗證的請求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM