我正在使用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
(如果重要:完整路径包含空格)
答案 0 :(得分:1)
我设法使用JAAS's debug output找到问题,我真的可以推荐。
简而言之,代码库始终是二进制根文件夹(或jar),而不是包含类文件的包文件夹。就我而言,这意味着所有类的代码库都是path/to/project/bin
,与策略中指定的path/to/project/bin/application/-
不匹配。
要解决此问题,需要将多个bin-folders或“output folder”作为Eclipse命名。为了得到这个:
Project Properties > Java Build Path
并选择Source
标签Allow output folders for source folders
Add Folder
在此之后,您可以将策略指向每个文件夹,如下所示
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);
}
这样,您(以及我们)将会了解更多可能有助于您找到问题的错误。