Tomcat中的安全管理器

Tomcat中的安全管理器,tomcat,securitymanager,Tomcat,Securitymanager,我有一个TomcatJava应用程序,我希望它是安全的,所以我创建了一个定制的SecurityManager,在那里我阻止了所有我认为危险的操作(我可能错过了一些,但这是另一个问题)。它运行了一段时间,但随后我的应用程序停止工作,在catalina.out中,我看到了以下消息: 12/07/2011 10:31:42 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler process SEVERE: Error read

我有一个TomcatJava应用程序,我希望它是安全的,所以我创建了一个定制的SecurityManager,在那里我阻止了所有我认为危险的操作(我可能错过了一些,但这是另一个问题)。它运行了一段时间,但随后我的应用程序停止工作,在catalina.out中,我看到了以下消息:

12/07/2011 10:31:42 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler process
SEVERE: Error reading request, ignored
java.lang.SecurityException
    at gwtchat.server.ScriptBotSecurityManager.checkWrite(ScriptBotSecurityManager.java:167)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:234)
    at java.net.SocketOutputStream.<init>(SocketOutputStream.java:58)
    at java.net.AbstractPlainSocketImpl.getOutputStream(AbstractPlainSocketImpl.java:411)
    at java.net.Socket$3.run(Socket.java:857)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.Socket.getOutputStream(Socket.java:854)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:163)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)
12/07/2011 10:31:42 org.apache.coyote.http11.http11协议$Http11ConnectionHandler进程
严重:读取请求时出错,已忽略
java.lang.SecurityException
在gwtchat.server.ScriptBotSecurityManager.checkWrite(ScriptBotSecurityManager.java:167)
位于java.io.FileOutputStream。(FileOutputStream.java:234)
位于java.net.SocketOutputStream。(SocketOutputStream.java:58)
位于java.net.AbstractPlainSocketImpl.getOutputStream(AbstractPlainSocketImpl.java:411)
在java.net.Socket$3.run(Socket.java:857)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.Socket.getOutputStream(Socket.java:854)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:163)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
位于org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
运行(Thread.java:636)
在第一行中,gwtchat.server.ScriptBotSecurityManager是我的自定义SecurityManager,函数是checkWrite(FileDescriptor fd),我阻止了它,因为我不希望我的应用程序写入文件


当然,我只想阻止我的应用程序,而不是Tomcat服务器本身。我怎样才能做到这一点?

我无法回答您的问题,但我真的很想知道您为什么要实现自己的安全管理器。为什么安全策略不能满足您的要求?如果你想解决这个问题,你必须了解所有Tomcat的内部结构!我正在开发一个系统,用户可以发送Javascript代码片段,并在服务器上执行(使用ScriptEngine)。因此,我需要一个非常严格的安全管理器,这将不允许用户代码损害服务器。但是,我确实希望允许一些特定的特权操作,例如来自特定数据库表的数据,或者写入特定日志文件。这就是为什么我需要一个自定义SM。