【问题标题】:Setting the Java SecurityManager for one method only仅为一种方法设置 Java SecurityManager
【发布时间】:2012-02-28 12:55:53
【问题描述】:

我有一个方法 A,它可能如下所示:

public double A{
  if (secM == null) {
    secM = new SecurityManager();
    System.setSecurityManager(secM);
  }
  //do something and return a double

}

问题是,一旦设置了SecurityManager,它就适用于整个项目,但我只需要它适用于这个方法所在的类。 如何告诉 SecurityManager 仅验证此方法/类的权限?

【问题讨论】:

    标签: java permissions securitymanager


    【解决方案1】:

    您希望 SecurityManager 阻止哪些操作,以及您希望允许哪些操作? SecurityManager 更常用于通过 any 方法控制特定操作,而不是通过单个方法控制操作。

    但是,它也可以执行后者,方法是创建一个自定义 SecurityManager 来检查调用堆栈 - 参见 this answer 的示例 - 这是您需要的吗?

    您可以为系统范围的 SecurityManager 提供针对您的应用程序量身定制的策略,这样您就可以允许大多数事情,但阻止一小部分操作。你可以控制的权限是listed here

    更新:您可能可以通过将您的方法拉出到一个单独的类中来更优雅地做到这一点,该类可以单独加载(由不同的类加载器)而不是你的其他课程。见this example。然后你可以用类加载器做一个简单的检查,而不是检查完整的堆栈跟踪。但是,我不熟悉这种方法 - 如果来自两个单独的类加载器的类需要交互,则可能会产生影响......

    【讨论】:

    • 该方法不应该被允许做任何事情,它应该只用于计算等。也许你的建议会起作用,但我不确定。
    • 我尝试了您建议的答案,到目前为止它有效,但它并不那么优雅。没有其他方法可以实现我的需要吗?
    • 嗯,我不确定通过修改类加载器是否可以实现我所需要的。我在这里找到了另一种方法:stackoverflow.com/questions/502218/…。但是我不知道SecurityManager的第二种方法中的变量“pass”是做什么用的?
    • 这些方法都非常相似。您链接的想法是您可以在运行不受信任的代码后再次关闭安全管理器。 pass 是用于对安全管理器进行身份验证的密码或机密,从而确保不受信任的代码不能只是禁用安全管理器并为所欲为!
    • 好的,到目前为止我已经知道了,但我仍然不太明白如何检查 SecurityManager 是否对所有方法都处于活动状态,或者只针对有问题的方法?或者我是否需要实现您最初建议的答案,而不是占位符“//覆盖 checkXXX 方法”(在我之前提供的链接的选项 2 中)?
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2015-09-06
    相关资源
    最近更新 更多