安全-訪問控制器
類java.security.AccessController提供了一個默認(rèn)的安全策略執(zhí)行機(jī)制,它使用棧檢查來決定潛在不安全的操作是否被允許。
這個訪問控制器不能被實(shí)例化,它不是一個對象。而是集合在單個類中的多個靜態(tài)方法。
AccessController.checkPermission() 決定一個特定的操作能否被允許。
這個方法將指向Permission對象的引用作為唯一的參數(shù),并且返回void。
如果AccessController確定這個操作被允許,將簡單的返回;否則異常中止。
AccessController.checkPermission() 實(shí)現(xiàn)的基本算法決定了調(diào)用棧中的每個幀是否有權(quán)執(zhí)行潛在不安全的操作。
每一個棧幀代表了由當(dāng)前線程調(diào)用的某個方法,每一個方法是在某個類中定義的,每一個類屬于某個保護(hù)域,每個保護(hù)域包含一些權(quán)限。為了使傳遞給AccessController.checkPermission() 的Permission對象所代表的的操作被允許,這個AccessController的基本算法要求,和調(diào)用棧上的每個幀相關(guān)連的權(quán)限必須包含或隱含傳給checkPermission()的Permission對象
AccessController.checkPermission() 自頂向下檢查棧,只要他遇到一個沒有權(quán)限棧幀,它將拋出異常。
通過拋出異常,AccessController指明這個操作不能被允許。
相反,如果checkPermission() 方法到達(dá)棧的底部,也沒有遇到這種棧幀情況,checkPermission() 將簡單的返回。
通過簡單返回而不是拋出異常,AccessController指明這個操作可以被允許。
調(diào)用AccessController.doPrivileged()方法中的任何一個,程序就可以讓AccessController中止它對棧的一幀一幀的掃描。
implies()方法
它是在Permission類、PermissionCollection類、ProtectionDomain類中聲明的。
將一個Permission對象作為它唯一的參數(shù),返回布爾值true或者false。
Permission.implies確定由Permission對象所代表的的權(quán)限,是否在本質(zhì)上隱含在由一個不同的Permission對象所代表的的權(quán)限中。PermissionCollection和ProtectionDomain的implies方法確認(rèn)一個被傳遞的Permission是否包含或隱含在封裝在PermissionCollection或ProtectionDomain中的Permission對象集合中。