我有一些代码使用下面的代码从控制台读取用户输入.
Console console = System.console(); String input = console.readLine();
但是,此代码应在非常安全的环境中运行,其中每个操作的权限都通过策略文件控制.
grant codeBase "file:/myjar.jar" { permission java.security.AllPermission; };
我不知道我应该使用什么权限来授予console.readLine()的权限.
解决方法
如果您在启用了SecurityManager的JVM中使用System.console,则需要以下RuntimePermissions:
permission java.lang.RuntimePermission "readFileDescriptor"; permission java.lang.RuntimePermission "writeFileDescriptor";
为什么?
System.in和System.out文件描述符(0和1,其中2表示System.err)已经对JVM开放. SecurityManager通过checkWrite(FileDescriptor fd)
method验证您是否具有对打开文件描述符的写访问权限,并且类似于您通过checkRead(FileDescriptor fd)
method具有读访问权限.这些方法所需的RuntimePermission在javadocs中列出.
虽然“writeFileDescriptor”可能看起来多余,但是有必要初始化Console对象(至少在Oracle Java 7运行时中).