深入理解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 {
/**
* 1、map鍵值對,鍵對應許可權的部門,值是陣列,對應操作該部門的許可權
*/
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;
}
/**
* 2、map鍵值對,鍵對應使用者物件,值對應該使用者對應的許可權,值也是一個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[]>> userAndPower= g.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系