首頁  >  文章  >  Java  >  Java之Spring AOP 實作使用者權限驗證

Java之Spring AOP 實作使用者權限驗證

高洛峰
高洛峰原創
2017-02-03 13:19:221739瀏覽

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

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

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

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.javano

reee

reee

,進行權限認證。我這裡分了三種類型:全部驗證、只驗證登入、不驗證用來滿足我們的業務需求。

這裡的回傳值可以是 JSON 串,也可以是跳到對應的頁面,來實現你想要的效果。

四、設定攔截器

/**
 * 权限认证拦截器
 *
 */
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=&#39;"
        // + url + "&#39;</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;
  } 
}

在/WebContent/WEB-INF/springMVC-servlet.xml檔案下的節點配置就行,這裡可以設定具體要攔截的 Url。

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

使用就非常簡單

因為我們的攔截器配置,然後我們在自訂註解的預設是驗證,所以,我們只需要在類別名稱及方法名稱上打標籤就可以。

Java之Spring AOP 实现用户权限验证

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。

更多Java之Spring AOP 實作使用者權限驗證相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn