在Eclipse中开发期间使用安全策略中的“代码库”

时间:2013-11-20 16:26:13

标签: java eclipse jaas

我正在使用Java安全策略,对我来说它仍然是新的。我希望能够直接将代码作为启动配置运行,因此我有一个调试器和所有其他很好的IDE。

我可以让它工作,直到我在策略中使用codebase属性。

我在application包中创建了一个LoginContext的类。策略文件位于项目的根目录中。有了这个内容,它可以正常工作:

grant {
   permission javax.security.auth.AuthPermission "createLoginContext.Sample";
   permission javax.security.auth.AuthPermission "doAsPrivileged";
};

但是当我添加代码库时,它会失败并显示Cannot create LoginContext. access denied ("javax.security.auth.AuthPermission" "createLoginContext.Sample")

grant codebase "file:./bin/application/-" {
   permission javax.security.auth.AuthPermission "createLoginContext.Sample";
   permission javax.security.auth.AuthPermission "doAsPrivileged";
};

我已为codebase

尝试了这些值
  1. 文件:应用/ -
  2. 文件:./应用/ -
  3. 文件:BIN /应用/ -
  4. 文件:./仓/应用/ -
  5. file:C:/ Full Path / to / project / bin / application / -
  6. file:// C:/ Full Path / to / project / bin / application / -
  7. (如果重要:完整路径包含空格)

2 个答案:

答案 0 :(得分:1)

我设法使用JAAS's debug output找到问题,我真的可以推荐。

简而言之,代码库始终是二进制根文件夹(或jar),而不是包含类文件的包文件夹。就我而言,这意味着所有类的代码库都是path/to/project/bin,与策略中指定的path/to/project/bin/application/-不匹配。

要解决此问题,需要将多个bin-folders或“output folder”作为Eclipse命名。为了得到这个:

  1. 进入Project Properties > Java Build Path并选择Source标签
  2. 激活Allow output folders for source folders
  3. 点击Add Folder
  4. ,添加您喜欢的任意数量的源文件夹
  5. 对于每个源文件夹,首先选择输出文件夹项目,然后单击编辑,指定输出文件夹。
  6. Mark of important buttons in Project Properties

    在此之后,您可以将策略指向每个文件夹,如下所示

    grant codebase "file:binLogin/-" {
        permission javax.security.auth.AuthPermission "modifyPrincipals";
    };
    
    grant codebase "file:binApp/-" {
       permission javax.security.auth.AuthPermission "createLoginContext.Sample";
       permission javax.security.auth.AuthPermission "doAsPrivileged";
    };
    

    我希望将来可以帮助其他人。

答案 1 :(得分:0)

我意识到这可能有资格作为评论,但它有点太大,可能会帮助你自己找到答案。

您的代码看起来改编自this tutorial。如果是这样,您可以修改该示例中捕获异常的代码:

  try {
      lc = new LoginContext("Sample",
                      new MyCallbackHandler());
  } catch (LoginException le) {
      System.err.println("Cannot create LoginContext. "
          + le.getMessage());
      System.exit(-1);
  } catch (SecurityException se) {
      System.err.println("Cannot create LoginContext. "
          + se.getMessage());
      System.exit(-1);
  }

到此:

  try {
      lc = new LoginContext("Sample",
                      new MyCallbackHandler());
  } catch (LoginException le) {
      System.err.println("Cannot create LoginContext. "
          + le.getMessage());
      le.printStackTrace();
      System.exit(-1);
  } catch (SecurityException se) {
      System.err.println("Cannot create LoginContext. "
          + se.getMessage());
      se.printStackTrace();
      System.exit(-1);
  }

这样,您(以及我们)将会了解更多可能有助于您找到问题的错误。