從零開始學 Java - Spring AOP 實現用戶權限驗證

ImaIHPC 8年前發布 | 13K 次閱讀 Spring AOP Java開發

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

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

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

AOP 實現用戶權限驗證

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

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

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

開始擼一下代碼

一、建立 AuthorityType.java 枚舉類

public enum AuthorityType {

// 登錄和權限都驗證 默認
Validate,

// 不驗證
NoValidate,

// 不驗證權限
NoAuthority;

}</code></pre>

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

二、新建 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;

}</code></pre>

三、再建一個 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; }
    }</code></pre>

    這個類的目的就是在打過 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 。

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

    使用就非常簡單

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

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

     

     

    來自:http://blog.mayongfa.cn/88.html

     

 本文由用戶 ImaIHPC 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!