本站首页    管理页面    写新日志    退出 [QQ:172832876] [MSN:lanlanq@hotmail.com]
麒麟在天欢迎您

.:日期

«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30

.:我的分类

.:最新日志

.:显示信息

blog名称:
日志总数:64
评论数量:34
留言数量:3
访问次数:344850
建立时间:2006年3月10日

.:留言板

.:链接

        公告

在属于自己的一片天空中,敲打着键盘,记录下自己感兴趣和认为自己因该回忆的碎片,可能是财富,也可能是不足,过后你会发现你的进步,这就足够。
[J2EE]java.security 类 AccessController
luckystar 发表于 2008/6/16 14:32:29

hibernate 中的实例:public void validate() throws HibernateException {  AccessController.doPrivileged(          new PrivilegedAction() {           public Object run() {            checkListeners();            return null;           }          }   ); } public final class AccessControllerextends Object AccessController 类用于与访问控制相关的操作和决定。 更确切地说,AccessController 类用于以下三个目的: 基于当前生效的安全策略决定是允许还是拒绝对关键系统资源的访问, 将代码标记为享有“特权”,从而影响后续访问决定,以及 获取当前调用上下文的“快照”,这样即可相对于已保存的上下文作出其他上下文的访问控制决定。 可以将调用方标记为享有“特权”(请参阅 doPrivileged 及下文)。在做访问控制决定时,如果遇到通过调用不带上下文参数(请参见下文以获取关于上下文参数的信息)的 doPrivileged 标记为“特权”的调用方,则 checkPermission 方法将停止检查。如果该调用方的域具有指定的权限,则不进行进一步检查并且 checkPermission 正常返回,指示允许所请求的访问。如果该域不具有指定的权限,则通常抛出异常。 “特权”功能的标准用法如下所示。如果不需要从“特权”块返回值,则使用以下代码: somemethod() { ...normal code here... AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // privileged code goes here, for example: System.loadLibrary("awt"); return null; // nothing to return } }); ...normal code here... } PrivilegedAction 是一个具有单个方法的接口,该方法名为 run 并返回一个 Object。上述示例显示该接口的实现的创建;提供了 run 方法的具体实现。调用 doPrivileged 时,将 PrivilegedAction 实现的实例传递给它。doPrivileged 方法在启用特权后从 PrivilegedAction 实现调用 run 方法,并返回 run 方法的返回值作为 doPrivileged 返回值(在此示例中忽略)。 如果需要返回值,则可使用以下代码: somemethod() { ...normal code here... String user = (String) AccessController.doPrivileged( new PrivilegedAction() { public Object run() { return System.getProperty("user.name"); } } ); ...normal code here... } 如果在 run 方法中执行的操作可以抛出“已检查”异常(列在方法的 throws 子句中),则需要使用 PrivilegedExceptionAction 接口代替 PrivilegedAction 接口: somemethod() throws FileNotFoundException { ...normal code here... try { FileInputStream fis = (FileInputStream) AccessController.doPrivileged( new PrivilegedExceptionAction() { public Object run() throws FileNotFoundException { return new FileInputStream("someFile"); } } ); } catch (PrivilegedActionException e) { // e.getException() should be an instance of FileNotFoundException, // as only "checked" exceptions will be "wrapped" in a // PrivilegedActionException. throw (FileNotFoundException) e.getException(); } ...normal code here... } 在使用“特权”构造时务必 * 特别 * 小心,始终让享有特权的代码段尽可能小。 注意,checkPermission 始终在当前执行线程的上下文中执行安全性检查。有时,本来应该在给定上下文中进行的安全性检查实际需要在另一个 上下文中(例如,在 worker 线程中)完成。getContext 方法和 AccessControlContext 类是针对这种情况提供的。getContext 方法获取当前调用上下文的“快照”,并将其置于它所返回的 AccessControlContext 对象中。示例调用如下: AccessControlContext acc = AccessController.getContext() AccessControlContext 本身具有一个 checkPermission 方法,该方法基于它 所封装的上下文而不是当前执行线程作出访问决定。因此,另一上下文中的代码可以在以前保存的 AccessControlContext 对象上调用该方法。示例调用如下: acc.checkPermission(permission) 有时候您还可能不知道用于检查上下文的权限的优先级。这时可以使用 doPrivileged 方法来获取上下文: somemethod() { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // Code goes here. Any permission checks within this // run method will require that the intersection of the // callers protection domain and the snapshot's // context have the desired permission. } }, acc); ...normal code here... }  

阅读全文(4581) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144800494 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号