1. 程式人生 > >深入理解Java的Annotation系列-第四部分 註解的應用-使用註解實現許可權管理

深入理解Java的Annotation系列-第四部分 註解的應用-使用註解實現許可權管理

一、整體思路

1、先自定義一個用於許可權管理的註解

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface Authority {

     String module();//模組

     String privilege();//許可權,如果是多個許可權,可以是陣列

}

2、在對應的業務邏輯方法上使用註解宣告許可權

  package cn.com.bochy.biz;

import cn.com.bochy.authority.annotation.Authority;

/*

 *

具體業務邏輯類

 */

public class EmployeeManager {

    @Authority(module="employee2",privilege="query")

    public void  queryAll() {

       //實際程式碼應從資料庫中查詢出資料

        System.out.println("查詢所有的僱員資訊");

    }

}

3、查詢使用者和使用者對應的許可權

4、解析出註解資訊,和查詢使用者和使用者對應的許可權進行比較,看是否具有對應許可權

二、具體實現

1、架構

  

2、程式碼實現

1、Authority.java

package cn.com.bochy.authority.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/*

 * 自定義用於許可權管理的註解

 * @author:chenzhengfeng

 *

 */

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD

)

public @interface Authority {

     String module();//模組

     String privilege();//許可權,如果是多個許可權,可以是陣列

}

2、EmployeeManager.java

package cn.com.bochy.biz;

import cn.com.bochy.authority.annotation.Authority;

/*

 * 具體業務邏輯類

 */

public class EmployeeManager {

    @Authority(module="employee2",privilege="query")

    public void  queryAll() {

       //實際程式碼應從資料庫中查詢出資料

        System.out.println("查詢所有的僱員資訊");

    }

}

3、Admin.java

package cn.com.bochy.entity;

import java.io.Serializable;

/**

 * 實體類admin的封裝,

 * 包含使用者名稱和密碼

 *

 */

public class Admin implements Serializable {

    private static final long serialVersionUID = 1L;

private String name;

  public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public String getPassword() {

    return password;

}

public void setPassword(String password) {

    this.password = password;

}

private String password;

  public Admin() {

    // TODO Auto-generatedconstructor stub

}

}

4、Grant.java

     package cn.com.bochy.grant;

import java.util.HashMap;

import java.util.Map;

import cn.com.bochy.entity.Admin;

public class Grant {

    /**

     * 1map鍵值對,鍵對應許可權的部門,值是陣列,對應操作該部門的許可權

     */

  public Map<String,String[]> mapsAuth=newHashMap<String,String[]>();

  public Map<String, String[]> getMapsAuth() {

       return mapsAuth;

    }

    public void setMapsAuth(Map<String, String[]> mapsAuth) {

       this.mapsAuth = mapsAuth;

    }

/**

     * 2map鍵值對,鍵對應使用者物件,值對應該使用者對應的許可權,值也是一個Map物件

     */

  public Map<Admin,Map<String,String[]>> mapUser=newHashMap<Admin,Map<String,String[]>>();

  /**

   *  3、使用者許可權鍵值對,鍵對應使用者,值對應該使用者的許可權

   */

  public Map<Admin, Map<String, String[]>>getMapUser() {

    return mapUser;

  }

  /**

   * 4、用過grantPower給使用者授權

   * 實際開發中從資料庫中查詢出資料,並封裝出對應的Map或者List

   * 以下程式碼模擬

   */

   public void grantPower() {

       String[] strs=new String[]{"query","add","delete","update"};

       mapsAuth.put("employee", strs);//其中admin訪問的部門,陣列strs是訪問該部門的操作許可權

       Admin  a=new Admin();

       a.setName("admin");

       a.setPassword("admin123456");

       mapUser.put(a, mapsAuth);

   }

public void setMapUser(Map<Admin, Map<String, String[]>>mapUser) {

    this.mapUser = mapUser;

}

}

 4、TestAuthority.java

package cn.com.bochy.main;

import java.lang.reflect.Method;

import java.util.Map;

import java.util.Scanner;

import cn.com.bochy.authority.annotation.Authority;

import cn.com.bochy.biz.EmployeeManager;

import cn.com.bochy.entity.Admin;

import cn.com.bochy.grant.Grant;

/**

 * 測試程式碼

 * @author chenzhengfeng

 */

public class TestAuthority {

  public static void main(String[] args) {

      /**

       * 1、輸入使用者名稱和密碼,並封裝成Admin物件

       */

      @SuppressWarnings("resource")

    Scanner input=new Scanner(System.in);

      System.out.println("請輸入使用者名稱:");

      String  userName=input.next();

      System.out.println("請輸入密碼:");

      String  userPwd=input.next();

      Admin a=new Admin();

      a.setName(userName);

      a.setPassword(userPwd);

      EmployeeManager er=newEmployeeManager();

      /**

       * 2、查詢該使用者對應的許可權

       */

     Grant g=new Grant();

     boolean mark=false;//標記該使用者是否存在,檢測使用者的名字和密碼是否正確

     boolean mark2=false;//標記使用者是否擁有對應的許可權

      g.grantPower();

      Map<Admin,Map<String, String[]>> userAndPowerg.getMapUser();

     Map<String,String[]> mapsAuth=null;

      //遍歷,查詢是否有對應的使用者名稱和密碼

          for(Admin admin:userAndPower.keySet()) {

              //如果找到

              if(a.getName().equals(admin.getName())&&(a.getPassword().equals(admin.getPassword()))){

                    mark=true;

                    //使用者對應的許可權存入 mapsAuth

                    mapsAuth=userAndPower.get(admin);

                 break;

              }

          }

          if(mark==true) {//如果使用者存在

    try {

       //利用Java的反射機制獲取註解資訊

       Method m1=EmployeeManager.class.getDeclaredMethod("queryAll");

       Authority authority=      m1.getAnnotation(Authority.class);

       //列印該使用者的所有操作的部門和對應的許可權

       System.out.println(authority.module()+"  "+authority.privilege());

       //如果該使用者可以操作該部門

         if(mapsAuth.containsKey(authority.module())) {

             //獲取使用者操作該部門的所有許可權

            String[] s= mapsAuth.get(authority.module());

            //遍歷所有許可權

              for(String s1:s) {

                 //如果註解的許可權存在

                 if(s1.equals(authority.privilege())) {

                     //呼叫業務邏輯方法

                     er.queryAll();

                 }

                 break;

              }

              //如果所有的許可權中不包含註解的許可權

              mark2=true;

         }else {

             //使用者沒有查詢部門的許可權

             mark2=true;

         }

    } catch (NoSuchMethodException e) {

       // TODO Auto-generatedcatch block

       e.printStackTrace();

    } catch (SecurityException e) {

       // TODO Auto-generatedcatch block

       e.printStackTrace();

    }

    if(mark2==true) {

       System.out.println("使用者許可權不夠!");

    }

}

  else {

      System.out.println("使用者名稱和密碼不對!");

  }

}

}

三、輸出結果

請輸入使用者名稱:

admin

請輸入密碼:

admin123456

employee2  query

使用者許可權不夠!

該使用者只有訪問employee部門,不能訪問employee2部門。

四、內容擴充套件

   在實際開發中,經常結合過濾器或者攔截器或者AOP實現許可權管理,例項省略、

五、參考內容:

http://blog.csdn.net/liuc0317/article/details/48787793

2、使用註解實現定時器功能

http://www.cnblogs.com/yanbincn/archive/2012/06/19/2554318.html

3、使用註解實現許可權管理

http://blog.csdn.net/partner4java/article/details/4759788

相關推薦

深入理解ajax系列

blob selected 單選框 encode 展示 條目 種類型 %20 寫代碼 前面的話   現代Web應用中頻繁使用的一項功能就是表單數據的序列化,XMLHttpRequest 2級為此定義了FormData類型。FormData為序列化表單以及創建與表單格式相同的

深入理解AJAX系列篇--跨域問題

我們先了解一下域名地址的組成:http:// www . google : 8080 / script/jquery.js   http:// (協議號)   www (子域名)   google (主域名)    8080 (埠號)   scrip

深入理解Java的Annotation系列-部分 註解應用-使用註解實現許可權管理

一、整體思路 1、先自定義一個用於許可權管理的註解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Authority {      String modu

深入理解ajax系列八篇

row 用戶數據 方便 案例 默認方法 span target osi content 前面的話   在以前,網站的用戶與後端交互的主要方式是通過HTML表單的使用。表單的引入在1993年,由於其簡單性和易用性,直到電子商務出現之前一直保持著重要位置。理解表單提交,對於更深

深入理解ajax系列七篇

gin 開發工程師 tar component fin hasattr mar tex 員工 前面的話   雖然ajax全稱是asynchronous javascript and XML。但目前使用ajax技術時,傳遞JSON已經成為事實上的標準。因為相較於XML而言,J

深入理解計算機系統----章處理器體系結構

https://www.jianshu.com/p/15210eb3870d?open_source=weibo_search 原文地址 目錄 學習事物是怎樣工作的有其內在價值:處理器是如何工作的對於我們普通人來說一直是個祕密,我們將從零開始構建一個流水線處理器,為了實現這一處理器的軟

深入理解Tomcat系列 Engine和Host容器

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

深入理解ajax系列三篇——響應解碼

前面的話   我們接收到的響應主體型別可以是多種形式的,包括字串String、ArrayBuffer物件、二進位制Blob物件、JSON物件、javascirpt檔案及表示XML文件的Document物件等。下面將針對不同的主體型別,進行相應的響應解碼 屬性   在介紹響

深入理解ajax系列五篇

前面的話   一般地,使用readystatechange事件探測HTTP請求的完成。XHR2規範草案定義了進度事件Progress Events規範,XMLHttpRequest物件在請求的不同階段觸發不同型別的事件,所以它不再需要檢査readyState屬性。這個草案

DPM中的HOG原始碼的Matlab版重寫-《小超教你寫論文》系列部分第一篇

DPM中的HOG原始碼的Matlab版重寫-《小超教你寫論文》系列第四部分第一篇  《小超教你寫論文》系列前三部分分別翻譯了一篇文章;對文章中的公式進行了推導;介紹了作者使用的資料庫。作為系列的第四部分,開始對原文中的想法進行實現。 前一段陷入了一點誤區,一直在思考一個演算

章 Runtime應用實現NSCoding的自動歸檔和自動解檔

用runtime提供的函式遍歷Model自身所有屬性,並對屬性進行encode和decode操作。 通常系統自帶的資料型別,如:字典NSDictionary,陣列NSArray,字串NSString,

深入理解Java的Annotation系列-部分 使用註解編寫ORM框架

一、什麼是ORM? 物件關係對映(英語:(Object Relational Mapping,簡稱ORM,或O/RM,或O/Rmapping),是一種程式技術,隨著面向物件的發展而產生的。用來把物件模型表示的物件對映到基於S Q L 的關係模型資料庫結構中去,或者把表中的

深入理解閉包系列篇——常見的一個迴圈和閉包的錯誤詳解

前面的話   關於常見的一個迴圈和閉包的錯誤,很多資料對此都有文字解釋,但還是難以理解。本文將以執行環境圖示的方式來對此進行更直觀的解釋,以及對此類需求進行推衍,得到更合適的解決辦法 犯錯 function foo(){ var arr = []; for(var i = 0

實現HTTPS系列彈之【TLS ,SSL等概念理解

tls pki ssl 博文說明【前言】: 本文將通過個人口吻介紹TLS ,SSL,PKI等相關知識,在目前時間點【2017年5月21號】下,所掌握的技術水平有限,可能會存在不少知識理解不夠深入或全面,望大家指出問題共同交流,在後續工作及學習中如發現本文內容與實際情況有所偏差,將會完善該博文

Python培訓知識總結系列- 第二章Python數據結構部分-字典操作

... 哈希 int lis san 變量 ems python python字典 python字典鍵值對的添加和遍歷 添加鍵值對 首先定義一個空字典 dic={}1直接對字典中不存在的key進行賦值來添加 dic[‘name‘]=‘zhangsan‘dic{‘name‘:

深入理解計算機系統_第一部分_三章_程式的機器級表示

深入,並且廣泛 -沉默犀牛 文章導讀 計算機執行機器程式碼,用位元組序列編碼低階的操作,包括處理資料、管理記憶體、讀寫儲存裝置上的資料,以及利用網路通訊。編譯器基於程式語言的規則、目標機器的指令集和作業系統遵循的慣例,經過一系列的階段生成機器程式碼。GCC C語言編譯器以彙

Linux Unix shell 編程指南學習筆記(部分

fcm 驗證 () only arguments line div 反饋 sed 第十六章 shell腳本介紹 此章節內容較為簡單,跳過。 第十七章 條件測試 test命令 expr命令 test 格式 test condition 或者 [

深入理解計算機系統 三章大略和五章大略

$0 一個 編譯 存儲器 系統 32位 做了 ++i 擴展 這2章總結的很少,主要是覺得沒那麽重要。 1.2個操作數的指令,第二個操作數通常是目的操作數:movb a b,move a to b,而add a b,b+=a,指令分為指令類,如mov類:movb,movw,m

【Linux探索之旅】部分三課:文件傳輸,瀟灑同步

命令行 上傳文件 文件夾 images lsh wget命令 ace 目標 wechat 內容簡單介紹 1、第四部分第三課:文件傳輸。瀟灑同步 2、第四部分第四課:分析網絡。隔離防火 文件傳輸。瀟灑同步 這一課的內容相

深入理解JavaScript系列

復用 類型 橋接 職責鏈模式 學習 組合 設計模式之代理模式 職責 理論 該文用於自我學習~ 來自:湯姆大叔 深入理解JavaScript系列文章,包括了原創,翻譯,轉載,整理等各類型文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。 深入理解JavaScript系