[b]許可權控制包括功能控制和資料控制,這裡只做功能控制的總結:[/b]
先來看一張普通許可權類圖表示關係:
[img]
1:功能控制:
a)伺服器端控制
b)客戶端控制
2:伺服器端控制:
可以選擇的方法很多,(spring aop、struts2***、filter過濾器、springmvc ***等等。)不管採用哪種方式控**務器端的訪問都是乙個目的:控制使用者訪問的url(使用者訪問的方法),因此對於控制就需要乙個檢查使用者是否有此方法執行的許可權,(檢查使用者許可權的方法)。只要在使用者請求某個url或者方法時 我們做一下檢查如果使用者有這個許可權,就繼續執行,沒有就跳轉到 沒有許可權的頁面(自己定義)
再來看這個方法:
對於許可權就是資源和操作,那麼在系統啟動的時候,可以把所有的許可權(function)資料初始化到(list、map、set、快取、等等)中,備用。使用者登入成功後可以通過使用者得到用所有的許可權(function)這裡包括資源和操作。
當使用者請求乙個url過來的時候,我們可以得到url字串,並對這個字串做一些列的操作,最終目的是得到和資料庫中function對應的url一致的字串,然後比較一下。如果有就方形,沒有就跳轉頁面
/**
*url 使用者請求的url
*f 使用者所擁有的操作許可權(根據使用者資訊查詢資料庫得到)
**/boolean checkuserfunction(listf,stirng url)
這樣就可以控**務器端的訪問許可權了。但是有個問題:對於使用者登入,使用者退出,有。。。一些不需要許可權控制的url也做了限制。這裡有種思路:
1)在做驗證許可權的時候(執行checkuserfunction)之前判斷一下這個url是不是需要做許可權檢查,需要就檢查,不需要就放行,不檢查。
2)如果採用框架之類的驗證(springaop struts2 等等),可以在要執行許可權檢查的方法上寫個註解(自己寫),然後再檢查許可權的時候可以方便的看看如果此方法有這個註解就驗證,沒有就不驗證。和上面一樣了。只提供思路
因為大部分系統都使用了spring ,這裡建議採用spring的aop 如何配置我就不寫了。每個人的配置方式可能不太一樣,但是目的都是一樣的。
到此伺服器端的許可權驗證就完了。
客戶端的許可權檢查:
[img]
1:選單列表 一般都是迴圈使用者的許可權得到的。
[img]
這樣是不是就可以看出如何做了。
先根據使用者查權/限 parentid is null and id in(select funid from fun_role where role id in (select roleid from role_user where userid =?))頂級選單 就是關聯查詢。自己寫吧。我瞎寫了一下。
在根據使用者查 parentid in (頂級選單ids) url is not null 去掉重複的就是使用者的二級選單了。
這樣就很好迴圈了。先迴圈頂級選單的list 顯示名字 在迴圈二級選單的list if(parentid==id)顯示名字就行了。
2) 通過自定義標籤去做迴圈的時候把不需要的過濾出來。
比如迴圈頂級選單,然後再裡面做個自定義標籤,傳入頂級選單的id
在tagsupport 類裡自己處理,當然處理的時候,也要是需要使用者的許可權列表的list的。符合條件就渲染出來,不符合就跳過。
自己去看如何自定義標籤吧。
按鈕的控制:
1:如果用了struts2 ,專案裡面同一用了struts2的標籤庫,比如
或者button ,這樣就可以修改struts2的原始碼了,原始碼如何改自己想辦法,提供思路:把需要修改的類找到原始碼,然後新建乙個和他的包名一樣,類名一樣的類。把原始碼copy進去,在你需要的地方修改就可以了。檢查許可權(使用者的許可權已經查出來了。),通過action 這個名字可以很容易的得到這個按鈕對應的許可權url,在比較這個url和使用者的許可權列表,如果沒有這個許可權就不渲染超連結,如果有才渲染。(dostarttag 標籤開始 時呼叫 和doendtag標籤結束式呼叫的方法,返回值不同有不同的含義。再整理。)
2:一般的專案可能不會用框架的標籤庫,這樣我們就自定義乙個標籤用來輸出,在專案開發初期設計好乙個標籤,便於用來做許可權控制,要求專案組的用到鏈結的地方都用此標籤。當然,這要和美工事先約定好,是用button,還是用超連結做按鈕。
自定義標籤mytag:a id="" name="" action="" url="" class="" 一般就用到這些吧。然後在自定義標籤裡判斷是否顯示此按鈕。
我有想有另外一種做法:
因為之前說的在存許可權(選單和操作的時候) 存了id不管是button的id 還是超連結的id還是別的id 都可以的。我們可以寫乙個全域性的js函式,在使用者訪問乙個連線的時候,可以得到使用者的所有的操作許可權的id(也就是頁面中按鈕或者超連結對應的id)集合。這些資料自己可以整理一下,便於使用。將這些id和所有的許可權(資料庫中所有的許可權操作)比較(就是使用者擁有的操作按鈕id 和所有操作id比較) 如果沒有就根據id remove掉,remove之前先判斷能不能取到這個js物件。這樣把這個js作為乙個全域性的js引入就可以了。
4:大部分專案的後台會用到一些js框架,我這次簡單的使用了一下liggerui這個框架,我想大部分框架都差不多。通過框架一般生成的按鈕是根據id找不到的。也不好再自定義標籤。
此時如何做呢。還是需要和上面刪除remove按鈕一樣的思路。
不過不能根據id了。通過上面我們可以排除出來哪些按鈕是不用的,可以知道id
我們就要研究js框架了,看看他是如何做的,然後根據特點把他的按鈕刪除掉就可以了。
下面試ligerui的按鈕刪除:
******* : ,,,
,/ui/ligerui/skins/icons/delete.gif'
}, , ]
}
[img]
到這功能許可權的前台控制和伺服器端控制都完了。
我們可以根據專案需要選擇不同的思路。
我對js框架刪除不是很了解只有這一種思路,我想應該有更好的思路去解決這個js框架按鈕的許可權控制。
關於linux系統中的許可權
1.檔案系統的許可權 ugo許可權 按照所有者許可權,組許可權,其他使用者許可權的匹配規則從前往後匹配許可權 關於目錄許可權 對目錄只有r許可權的話,只能簡單的列出目錄下的資訊,不能詳細列出,也不能在該目錄下建立檔案 只有r配合x之後才能檢視詳細資訊 對目錄只有w許可權的話,什麼都做不了 如果要對目...
Linux 系統檔案許可權總結
在 linux 中最基本的任務之一就是設定檔案許可權。理解它們是如何實現的是你進入 linux 世界的第一步。如您所料,這一基本操作在類 unix 作業系統中大同小異。實際上,linux 檔案許可權系統就直接取自於 unix 檔案許可權 甚至使用許多相同的工具 你要明白的第一件事是檔案許可權可以用來...
mysql 系統許可權 MySQL 的許可權系統
create user liub localhost identified by liub create table g user id varchar 10 username varchar 20 userpwd varchar 20 insert into g user values 1 liu...