乙個簡易實用的web許可權管理模組的應用與實現

2021-08-29 19:25:41 字數 1731 閱讀 4593

本文介紹乙個簡易實用的web許可權管理模組的應用與實現。

先介紹資料模型和應用介面,後繼對實現細節做選擇性闡述。

資料表關係如下:

該圖標明了登陸使用者、角色、部門(機構)、使用者組、角色和模組功能之間的關係。為方便起見,所有表都只保留必要字段。

在本系統設計中,如下概念有著相對特殊的含義。

一、使用者(user): 系統的使用者。

二、部門(org):體現了使用者的行政關係,

三、組(group) :是某相同職能的使用者的集合,可以和使用者一樣與角色產生關聯。設定組的目的是為了方便使用者的角色分配,減少使用者與角色的直接對應關係。使用者的角色可以是其組角色和其直接分配的角色之合集。限於作者的時間和精力,組功能在該系統中沒有具體的實現。

四、角色(role):角色對應著某些功能(function)的集合,被分配乙個角色意味著有權執行這些功能。角色表中的字段"functions"記錄相關的功能id,id之間用逗號隔開。

五、功能(function):系統的乙個或者多個執行准入。

那麼如何表現「功能」以最終實現控制使用者的每乙個細微動作呢?假如不特定於某種架構,可以這麼設計該表字段:

create table  `m2_function` (

`function_id` int(10) unsigned not null auto_increment,

`name` varchar(50) not null,

`func_tree_id` int(10) unsigned not null,

`resource` varchar(100) not null,

`suffix` varchar(50) not null,

`description` varchar(100) not null,

`params` varchar(45) not null,

primary key (`function_id`)

) default charset=utf8;

這三個訪問點被人為的劃分為兩個功能准入(當然亦可以是乙個或者三個),見下圖     

由此可知,「功能」是衡量使用者准入的最小刻度。在使用者訪問某個位址的時候,我們可以通過解析url對比他擁有的「功能」許可權來實現許可權管理。

借助於某些架構或者設計思路,可以避免使用者直接訪問jsp頁面,甚至全系統的訪問位址都使用同一字尾,這種情況下可以省去suffix欄位。 本系統就是這種情況(jsp頁面置於web-inf下,採用struts2架構)。

六、功能模組樹(function tree):功能的目錄組織,起分類的作用。在為角色設定功能的時候,使用者介面可以利用帶選擇框的js樹。而這顆js樹是後台的功能樹表以及功能表的聯合表現形式。功能模組樹可以方便的與選單樹建立對映關係,限於作者的時間和精力,該系統並未實現選單樹。

下面從實際應用入手做直觀的介紹:

用超級管理員帳號yt000登陸(該帳號擁有全部的許可權,帳號資訊應該預先寫入資料庫或者以配置檔案方式放到類路徑下):

首先是機構管理部分,這裡可以編輯某個公司或者單位的組織結構:

然後進入使用者管理部分,會有乙個使用者列表:

還可以為使用者設定多個角色:

接著,再看看角色的列表:

可以為角色設定功能。該角色設定樹的生成,在後繼文章中會有介紹。

最後,在系統資源部分,可以進行功能模組樹的編輯(和機構樹的編輯一樣)

配置妥當以後,當我們以乙個普通使用者登入,執行某個操作的時候,如果沒有許可權,系統會做出提示。關於使用者的許可權驗證,後繼會有介紹。

乙個簡易的shell

shell本質上就是將程序程式替換 替換原理 用fork建立子程序後執行的是和父程序相同的程式 但有可能執行不同的 分支 子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec函式時,該程序的使用者空間 和資料完全被新程式替換,從新程式的啟動例程開始執行。呼叫exec並不建立新程序...

乙個簡易的SocketIM

今天做了乙個簡易的socketim的小示例。基本思想是開啟兩個winform,每個winform既充當伺服器也充當客戶端。乙個監聽8000埠,另外乙個監聽8001埠,兩個winform接收到資訊之後將資訊顯示在form的控制項上。這篇記錄一下碼code中學到的一些東西。net的socket庫已經將c...

乙個實用的類

myurlutil.as public class myurlutil 得到url後的指定的key對應的value public function getvaluebykey str string,key string string break return null 用法 if this.pare...