一種常用的權(quán)限控制算法的實(shí)現(xiàn) 參考LINUX/UNIX權(quán)限編碼
創(chuàng)新互聯(lián)專注于四川網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供四川營銷型網(wǎng)站建設(shè),四川網(wǎng)站制作、四川網(wǎng)頁設(shè)計(jì)、四川網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造四川網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供四川網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
這里筆者介紹一種很常用 也比較專業(yè)的權(quán)限控制思路
要換成其他的語言主 自己轉(zhuǎn)一下就可以了
這里用java語言描述 其實(shí)都差不多的
為了方便起見 我們這里定義a^b為 a的b次方
這里 我們?yōu)槊恳粋€(gè)操作設(shè)定一個(gè)唯一的整數(shù)值 比如
刪除A---
修改A---
添加A---
刪除B---
修改B---
添加B---
……
理論上可以有N個(gè)操作 這取決于你用于儲(chǔ)存用戶權(quán)限值的數(shù)據(jù)類型了
如果用戶有權(quán)限
添加A---
刪除B---
修改B---
那用戶的權(quán)限值 purview = ^ + ^ + ^ = 就是 的權(quán)的和 化成二進(jìn)制可以表示為
這樣 如果要驗(yàn)證用戶是否有刪除B的權(quán)限 就可以通過位與運(yùn)算來實(shí)現(xiàn)
在JAvA里 位與運(yùn)算運(yùn)算符號(hào)為& 即是
int value = purview ((int)Math pow( ));
你會(huì)發(fā)現(xiàn) 當(dāng)用戶有操作權(quán)限時(shí) 運(yùn)算出來的結(jié)果都會(huì)等于這個(gè)操作需要的權(quán)限值!
原理
位與運(yùn)算 顧名思義就是對(duì)位進(jìn)行與運(yùn)算
以上面的式子為例 purview ^ 也就是
將它們化成二進(jìn)制有
== (十進(jìn)制)?。剑健?^
同理 如果要驗(yàn)證是否有刪除A--- 的權(quán)限
可以用 purview ((int)Math pow( ));
即
== (十進(jìn)制)!= ^
這種算法的一個(gè)優(yōu)點(diǎn)是速度快
可以同時(shí)處理N個(gè)權(quán)限
如果想驗(yàn)證是否同時(shí)有刪除A--- 和刪除B--- 的權(quán)限 可以用
purview( ^ + ^ )==( ^ + ^ )?true:false;
設(shè)置多角色用戶 根據(jù)權(quán)限值判斷用戶的角色
下面提供一個(gè)java的單操作權(quán)限判斷的代碼
//userPurview是用戶具有的總權(quán)限
//optPurview是一個(gè)操作要求的權(quán)限為一個(gè)整數(shù)(沒有經(jīng)過權(quán)的?。?/p>
public static boolean checkPower(int userPurview int optPurview)
{
int purviewValue = (int)Math pow( optPurview);
return (userPurview purviewValue) == purviewValue;
}
當(dāng)然 多權(quán)限的驗(yàn)證只要擴(kuò)展一下就可以了
幾點(diǎn)注意事項(xiàng)
首先 一個(gè)系統(tǒng)可能有很多的操作
因此 請(qǐng)建立數(shù)據(jù)字典 以便查閱 修改時(shí)使用
其次 如果用數(shù)據(jù)庫儲(chǔ)存用戶權(quán)限 請(qǐng)注意數(shù)值的有效范圍
操作權(quán)限值請(qǐng)用唯一的整數(shù)!
public class Limits {
/**
* 常規(guī)信息下發(fā)
*/
public static final int CGXX_XF = ;
/**
* 常規(guī)信息列表
*/
public static final int CGXX_LB = ;
/**
* 常規(guī)信息審核
*/
public static final int CGXX_SH = ;
/**
* 包月用戶查看
*/
public static final int BYYH_CK = ;
/**
* 違章點(diǎn)播統(tǒng)計(jì)
*/
public static final int WZDB_TJ = ;
/**
* 定制提取詳細(xì)
*/
public static final int DZTQ_XX = ;
/**
* 請(qǐng)求記錄
*/
public static final int QQJL = ;
/**
* 管理員權(quán)限
*/
public static final int GLY_QX = ;
/**
* 驗(yàn)證權(quán)限
* @param limitsSum 權(quán)限總和 權(quán)限總和 為每個(gè)權(quán)限的 次方相加
* @param checkInt 具體權(quán)限
* @return
*/
public static boolean checkLimits(int limitsSum int checkInt){
return (limitsSum ( checkInt)) ;
}
/**
* 生成權(quán)限總值
* @param limits
* @return
*/
public static int createLimits(String[] limits){
int limitsSum = ;
for (int i = ; i limits length; i++) {
limitsSum += ( Integer parseInt(limits[i]));
}
return limitsSum;
}
lishixinzhi/Article/program/Java/hx/201311/25604
代碼沒有寫出起來,給你說一下原理吧!權(quán)限主要分為用戶角色菜單一個(gè)角色對(duì)應(yīng)多個(gè)用戶,多個(gè)角色對(duì)應(yīng)多個(gè)菜單這樣用戶登錄時(shí)可以通過用戶自己的角色得到相應(yīng)的菜單而菜單就直接關(guān)系到具體的功能操作了這樣就劃分出權(quán)限了比如每個(gè)人都有自己的名字如“1,2,3,4”而用戶可能有同樣的角色如:“1,2是管理員”“3,4是主任”這樣的管理員和主任就是角色這兩個(gè)角色的權(quán)利(權(quán)限)當(dāng)然不同了這樣就是權(quán)限管理了啊中文java技術(shù)網(wǎng)
思路:
1、用戶表 user;
2、角色表 role;
3、菜單 menu;
4、角色菜單權(quán)限表 role_menu;
5、用戶菜單權(quán)限表 user_menu;
Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程[1]? 。
Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、健壯性、安全性、平臺(tái)獨(dú)立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn)[2]? 。Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等[3]? 。
由于在開發(fā)Oak語言時(shí),尚且不存在運(yùn)行字節(jié)碼的硬件平臺(tái),所以為了在開發(fā)時(shí)可以對(duì)這種語言進(jìn)行實(shí)驗(yàn)研究,他們就在已有的硬件和軟件平臺(tái)基礎(chǔ)上,按照自己所指定的規(guī)范,用軟件建設(shè)了一個(gè)運(yùn)行平臺(tái),整個(gè)系統(tǒng)除了比C++更加簡(jiǎn)單之外,沒有什么大的區(qū)別。1992年的夏天,當(dāng)Oak語言開發(fā)成功后,研究者們向硬件生產(chǎn)商進(jìn)行演示了Green操作系統(tǒng)、Oak的程序設(shè)計(jì)語言、類庫和其硬件,以說服他們使用Oak語言生產(chǎn)硬件芯片,但是,硬件生產(chǎn)商并未對(duì)此產(chǎn)生極大的熱情。因?yàn)樗麄冋J(rèn)為,在所有人對(duì)Oak語言還一無所知的情況下,就生產(chǎn)硬件產(chǎn)品的風(fēng)險(xiǎn)實(shí)在太大了,所以O(shè)ak語言也就因?yàn)槿狈τ布闹С侄鵁o法進(jìn)入市場(chǎng),從而被擱置了下來。
1994年6、7月間,在經(jīng)歷了一場(chǎng)歷時(shí)三天的討論之后,團(tuán)隊(duì)決定再一次改變了努力的目標(biāo),這次他們決定將該技術(shù)應(yīng)用于萬維網(wǎng)。他們認(rèn)為隨著Mosaic瀏覽器的到來,因特網(wǎng)正在向同樣的高度互動(dòng)的遠(yuǎn)景演變,而這一遠(yuǎn)景正是他們?cè)谟芯€電視網(wǎng)中看到的。作為原型,帕特里克·諾頓寫了一個(gè)小型萬維網(wǎng)瀏覽器WebRunner。[4]
1995年,互聯(lián)網(wǎng)的蓬勃發(fā)展給了Oak機(jī)會(huì)。業(yè)界為了使死板、單調(diào)的靜態(tài)網(wǎng)頁能夠“靈活”起來,急需一種軟件技術(shù)來開發(fā)一種程序,這種程序可以通過網(wǎng)絡(luò)傳播并且能夠跨平臺(tái)運(yùn)行。于是,世界各大IT企業(yè)為此紛紛投入了大量的人力、物力和財(cái)力。這個(gè)時(shí)候,Sun公司想起了那個(gè)被擱置起來很久的Oak,并且重新審視了那個(gè)用軟件編寫的試驗(yàn)平臺(tái),由于它是按照嵌入式系統(tǒng)硬件平臺(tái)體系結(jié)構(gòu)進(jìn)行編寫的,所以非常小,特別適用于網(wǎng)絡(luò)上的傳輸系統(tǒng),而Oak也是一種精簡(jiǎn)的語言,程序非常小,適合在網(wǎng)絡(luò)上傳輸。Sun公司首先推出了可以嵌入網(wǎng)頁并且可以隨同網(wǎng)頁在網(wǎng)絡(luò)上傳輸?shù)腁pplet(Applet是一種將小程序嵌入到網(wǎng)頁中進(jìn)行執(zhí)行的技術(shù)),并將Oak更名為Java(在申請(qǐng)注冊(cè)商標(biāo)時(shí),發(fā)現(xiàn)Oak已經(jīng)被人使用了,再想了一系列名字之后,最終,使用了提議者在喝一杯Java咖啡時(shí)無意提到的Java詞語)。5月23日,Sun公司在Sun world會(huì)議上正式發(fā)布Java和HotJava瀏覽器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微軟等各大公司都紛紛停止了自己的相關(guān)開發(fā)項(xiàng)目,競(jìng)相購買了Java使用許可證,并為自己的產(chǎn)品開發(fā)了相應(yīng)的Java平臺(tái)。
感覺你這個(gè)太強(qiáng)悍了。
一般都是給菜單授權(quán),角色授予菜單,授予菜單權(quán)限的用戶能操作相應(yīng)的菜單。
你這個(gè)是給角色授予查詢表的權(quán)限,還有多少條記錄的。
查多少條記錄,這個(gè)真心不知道怎么搞;
授予查詢表的權(quán)限的這個(gè)應(yīng)該不難,每次查之前都先驗(yàn)證一下是否在授權(quán)范圍之類。
多表查詢的只要一個(gè)不滿足就不能查詢。
struts攔截器不推薦使用 建議使用spring AOP 面向切面 統(tǒng)一權(quán)限操作當(dāng)做一類失誤處理 對(duì)于數(shù)據(jù)庫權(quán)限 簡(jiǎn)單權(quán)限可以設(shè)定一張權(quán)限表 復(fù)雜權(quán)限 但權(quán)限沒有從屬關(guān)系可以使用2進(jìn)制表示 0101010 0和1分別代表是否具有該權(quán)限操作 多級(jí)權(quán)限表結(jié)構(gòu)又相應(yīng)復(fù)雜
給你一個(gè)簡(jiǎn)單的管理代碼
public class CheckIdAdvice implements MethodInterceptor {
protected final Log log = LogFactory.getLog(getClass());
public Object invoke(MethodInvocation invocation) throws Throwable {
String methodName = invocation.getMethod().getName();
for(int i=0;iConstant.levelOneMethod.length;i++)
{
if(Constant.levelOneMethod[i].equals(methodName))
{
Map map=(Map) ActionContext.getContext().get("session");
Admin admin=(Admin)map.get("admin");
if(admin.getQuanxian()!=nulladmin.getQuanxian()=1)
{
return invocation.proceed();
}
else
{
log.info("進(jìn)入失敗");
return false;
}
}
}
for(int i=0;iConstant.levelTwoMethod.length;i++)
{
if(Constant.levelTwoMethod[i].equals(methodName))
{
Map map=(Map) ActionContext.getContext().get("session");
Admin admin=(Admin)map.get("admin");
if(admin.getQuanxian()!=nulladmin.getQuanxian()=3)
{
return invocation.proceed();
}
else
{
log.info("進(jìn)入失敗");
return false;
}
}
}
for(int i=0;iConstant.levelThreeMethod.length;i++)
{
if(Constant.levelThreeMethod[i].equals(methodName))
{
Map map=(Map) ActionContext.getContext().get("session");
Admin admin=(Admin)map.get("admin");
if(admin!=nulladmin.getQuanxian()=5)
{
return invocation.proceed();
}
else
{
log.info("進(jìn)入失敗");
return false;
}
}
}
return invocation.proceed();
}
}
spring security可以實(shí)現(xiàn)。。不過spring要升級(jí)到3.0
tomcat6。7都能用,我有婉轉(zhuǎn)班。。置于前臺(tái)菜單用js隱藏也可以,用security判斷角色都行,
如果按資源判斷就要做acl。。這個(gè)很簡(jiǎn)單。。不過一般初學(xué)者要學(xué)會(huì)spring security至少要1,2個(gè)星期吧,如果樓主需要我可以把文檔發(fā)給你,如果你直接要代碼我也可以給你,但你看不懂。。建議還是看文檔先把,你留個(gè)郵箱給我我發(fā)給你。。
當(dāng)前題目:java后臺(tái)權(quán)限管理代碼 java開發(fā)權(quán)限管理系統(tǒng)
本文URL:http://chinadenli.net/article24/hgcece.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、自適應(yīng)網(wǎng)站、域名注冊(cè)、用戶體驗(yàn)、網(wǎng)站排名、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)