用戶訪問(wèn)控制(Access control )機(jī)制總是圍繞粗粒度和細(xì)粒度兩個(gè)方面來(lái)討論:
粗粒度控制:可以規(guī)定訪問(wèn)整個(gè)對(duì)象或?qū)ο笕旱哪硞€(gè)層,而細(xì)粒度控制則總是在方法或?qū)傩詫舆M(jìn)行控制,比如:
允許一個(gè)文件為只讀是屬于粗粒度控制,而允許對(duì)這個(gè)文件某行有寫(xiě)操作則屬于細(xì)粒度控制。
一個(gè)好的用戶控制機(jī)制當(dāng)然既允許粗粒度也允許細(xì)粒度控制,在Jive中我們看到是使用Proxy來(lái)達(dá)到這個(gè)目的,但是我們也發(fā)現(xiàn),由于需要對(duì)每個(gè)類(lèi)都要進(jìn)行細(xì)粒度控制,所以必然對(duì)每個(gè)類(lèi)都要做一個(gè)Proxy類(lèi),這樣帶來(lái)了很多Proxy類(lèi),如ForumProxy ForumThreadProxy ForumFactoryProxy等,無(wú)形增加了系統(tǒng)復(fù)雜性。
使用動(dòng)態(tài)Proxy可以很好的解決這個(gè)問(wèn)題。再結(jié)合java.security.acl的ACL機(jī)制,我們就可以靈活地實(shí)現(xiàn)粗粒度和細(xì)粒度的雙重控制。
當(dāng)一個(gè)用戶login后,我們就要在內(nèi)存中為其建立相應(yīng)的授權(quán)訪問(wèn)機(jī)制,使用java.security.acl可以很方便的建立這樣一個(gè)安全系統(tǒng)。
首先任何一個(gè)對(duì)象都應(yīng)該有個(gè)基本屬性:擁有者 或擁有者所屬組(Windows中每個(gè)目錄安全描述符都由4部分構(gòu)成:對(duì)象的創(chuàng)建者、對(duì)象所屬的組、自由存取控制和系統(tǒng)存取控制)。
1. Java acl開(kāi)始步是建立一個(gè)主體 Principal,其中SecurityOwner是主體的擁有者: private static final Principal _securityOwner = new PrincipalImpl("SecurityOwner");
2. 當(dāng)用戶login進(jìn)來(lái)時(shí),他帶有兩個(gè)基本數(shù)據(jù):訪問(wèn)密碼和他要訪問(wèn)的對(duì)象ApplicationName。首先驗(yàn)證用戶名和密碼,然后從數(shù)據(jù)庫(kù)中取出其權(quán)限數(shù)據(jù),建立Permission,這里使用Feature繼承了Permission,在Feature中定義了有關(guān)權(quán)限的細(xì)節(jié)數(shù)據(jù)(如讀 寫(xiě) 刪)。
// 取出用戶和被訪問(wèn)對(duì)象之間的權(quán)限關(guān)系,這種權(quán)限關(guān)系可能不只一個(gè),也就是說(shuō),用戶
//可能對(duì)被訪問(wèn)對(duì)象擁有讀 寫(xiě) 刪等多個(gè)權(quán)限,將其打包在Hasbtable中。
Hashtable features = loadFeaturesForUser(sApplicationName, sUserID);
3. 創(chuàng)建一個(gè)用戶對(duì)象
User user = new UserImpl(sUserID, new Hashtable() );
4. 為這個(gè)用戶創(chuàng)建一個(gè)活動(dòng)的acl entry
addAclEntry( user, features);
其中關(guān)鍵的是第四步addAclEntry,我們看看其如何實(shí)現(xiàn)的:
// 為這個(gè)用戶創(chuàng)建一個(gè)新的Acl entry
AclEntry newAclEntry = new AclEntryImpl( user);
//遍歷Hashtable features,將其中多種權(quán)限加入:
....
feature = (Feature) hFeatures.get(keyName);
newAclEntry.addPermission( feature );
....
也要加入主體擁有者SecurityOwner
這樣一個(gè)安全體系就已經(jīng)建立完成。
當(dāng)你在系統(tǒng)中要檢驗(yàn)?zāi)硞€(gè)用戶使用擁有某個(gè)權(quán)限,如讀的權(quán)利時(shí),只要acl.checkPermission(user, feature )就可以,acl是ACL的一個(gè)實(shí)例,這樣權(quán)限檢查就交給java.security.acl.ACL 去處理了。
有了ACL機(jī)制后,我們就可以在我們系統(tǒng)中使用動(dòng)態(tài)Proxy模式來(lái)對(duì)具體對(duì)象或方法進(jìn)行控制,比如,我們有一個(gè)Report類(lèi),有些用戶可以讀,有些用戶可以寫(xiě)(哪些用戶可以讀 哪些用戶可以寫(xiě),已經(jīng)在上面ACL里部署完成)。
從Java 1.3開(kāi)始, Sun提供了Dynamic Proxy API.為了使動(dòng)態(tài)Proxy能夠工作,你必須有一個(gè)Proxy接口,還要有一個(gè)繼承InvocationHandler的Proxy類(lèi)。
在下面的例子中,我們?cè)O(shè)定有三種用戶:普通人;雇員;經(jīng)理.權(quán)限是這樣:普通人可以讀報(bào)告;雇員和經(jīng)理可以修改報(bào)告。
按通常思維,我們對(duì)于讀權(quán)限,我們?cè)O(shè)計(jì)一個(gè)具備讀的角色類(lèi):
public interface IpersonRO {
public String getName();
public String getAddress();
public String getPhoneNumber();
}
類(lèi)里面都是讀的方法,這是一種粗粒度訪問(wèn)控制,也就是說(shuō)把讀寫(xiě)權(quán)限只落實(shí)到類(lèi)(對(duì)象)上,這樣的話,我們還要為寫(xiě)的角色再建一個(gè)類(lèi),很顯然這不是一個(gè)很好的方法,使用動(dòng)態(tài)proxy+acl就可以實(shí)現(xiàn)很好的細(xì)粒度控制。
public class ReportProxy implements InvocationHandler
{
private Map map;
public static Object newInstance(Map map,Class[] interfaces)
{
return Proxy.newProxyInstance(map.getClass().getClassLoader(), interfaces,new ReportProxy(map));
}
public ReportProxy(Map map)
{
this.map = map;
}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
{
Object result;
String methodName = m.getName();
if (methodName.startsWith("get"))
{
if (!acl.checkPermission(user, "read")) return null;
String name = methodName.substring(
methodName.indexOf("get")+3);
return map.get(name);
}
else if (methodName.startsWith("set"))
{
if (!acl.checkPermission(user, "write")) return null;
String name = methodName.substring(
methodName.indexOf("set")+3);
map.put(name, args[0]);
return null;
}
else if (methodName.startsWith("is"))
{
if (!acl.checkPermission(user, "read")) return null;
String name = methodName.substring(
methodName.indexOf("is")+2);
return(map.get(name));
}
return null;
}
}
動(dòng)態(tài)Proxy與Java ACL用戶訪問(wèn)控制機(jī)制實(shí)現(xiàn)
更新時(shí)間: 2008-06-03 14:21:30來(lái)源: 粵嵌教育瀏覽量:886
粵嵌動(dòng)態(tài)
推薦閱讀
- ·北京朝歌數(shù)碼科技股份有限公司專(zhuān)場(chǎng)招聘
- ·深圳研賽自動(dòng)化設(shè)備公司專(zhuān)場(chǎng)招聘(長(zhǎng)沙校區(qū))
- ·深圳市興禾自動(dòng)化股份有限公司專(zhuān)場(chǎng)招聘(長(zhǎng)沙校區(qū))
- ·中山市弘億實(shí)業(yè)有限公司專(zhuān)場(chǎng)招聘會(huì)
- ·東莞市德聲實(shí)業(yè)有限公司專(zhuān)場(chǎng)招聘
- ·深圳華創(chuàng)智聯(lián)電子有限公司專(zhuān)場(chǎng)招聘
- ·廣州2512全網(wǎng)運(yùn)營(yíng)就業(yè)班
- ·廣州2511嵌入式開(kāi)發(fā)就業(yè)班
- ·深圳市領(lǐng)世達(dá)科技有限公司專(zhuān)場(chǎng)招聘
- ·廣州2510嵌入式開(kāi)發(fā)就業(yè)班