2011-01-06 23 views
6

我一直在忙於爲Red5創建應用程序。想象一下,當我嘗試配置基本/摘要式身份驗證時,我感到驚訝,而我卻不能。 什麼讓我覺得奇怪的是,我有工作,並與下面的正確個XML驗證運行Tomcat實例:確實red5讀取tomcat-users.xml

web.xml中(部分)

<security-constraint> 
     <web-resource-collection> 
      <web-resource-name>A Protected Page</web-resource-name> 
      <url-pattern>/stats.jsp</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>tomcat</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <login-config> 
     <auth-method>DIGEST</auth-method> 
     <realm-name>BLAAAAAAAAAAAAAAAAA</realm-name> 
    </login-config> 
    <security-role> 
     <description/> 
     <role-name>tomcat</role-name> 
    </security-role> 

的tomcat-users.xml中的/ conf目錄,看起來有點像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<tomcat-users> 
    <role rolename="tomcat"/> 
    <user username="ide" password="bogus" roles="tomcat"/> 
</tomcat-users> 

令人討厭的是,配置在tomcat的servlet容器上正確認證,但在red5的修改版中,它只是一直要求認證。我變得生氣還是應該像魅力一樣工作?

  1. Red5的是版本0_9_1
  2. 的stats.jsp在兩個 servlet容器訪問,唯一的區別 是,當你輸入 正確的用戶名和密碼在 tomcat的,你登錄,在 red5你不是,它只是保持 要求你輸入密碼。

任何指針?我錯過了什麼嗎?

這是我收到的那一刻錯誤的堆棧跟蹤我嘗試登錄:

Caused by: java.io.IOException: Unable to locate a login configuration 
     at com.sun.security.auth.login.ConfigFile.init(ConfigFile.java:250) [na:1.6.0_22] 
     at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:91) [na:1.6.0_22] 
     ... 27 common frames omitted 
[ERROR] [http-127.0.0.1-5080-1] org.apache.catalina.realm.JAASRealm - Cannot find message associated with key jaasRealm.unexpectedError 
java.lang.SecurityException: Unable to locate a login configuration 
     at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:93) [na:1.6.0_22] 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [na:1.6.0_22] 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [na:1.6.0_22] 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [na:1.6.0_22] 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [na:1.6.0_22] 
     at java.lang.Class.newInstance0(Class.java:355) [na:1.6.0_22] 
     at java.lang.Class.newInstance(Class.java:308) [na:1.6.0_22] 
     at javax.security.auth.login.Configuration$3.run(Configuration.java:247) [na:1.6.0_22] 
     at java.security.AccessController.doPrivileged(Native Method) [na:1.6.0_22] 
     at javax.security.auth.login.Configuration.getConfiguration(Configuration.java:242) [na:1.6.0_22] 
     at javax.security.auth.login.LoginContext$1.run(LoginContext.java:237) [na:1.6.0_22] 
     at java.security.AccessController.doPrivileged(Native Method) [na:1.6.0_22] 
     at javax.security.auth.login.LoginContext.init(LoginContext.java:234) [na:1.6.0_22] 
     at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403) [na:1.6.0_22] 
     at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:394) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:357) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.authenticator.DigestAuthenticator.findPrincipal(DigestAuthenticator.java:283) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.authenticator.DigestAuthenticator.authenticate(DigestAuthenticator.java:176) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:523) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [catalina-6.0.24.jar:na] 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) [catalina-6.0.24.jar:na] 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) [tomcat-coyote-6.0.24.jar:na] 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) [tomcat-coyote-6.0.24.jar:na] 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) [tomcat-coyote-6.0.24.jar:na] 
     at java.lang.Thread.run(Thread.java:662) [na:1.6.0_22] 
Caused by: java.io.IOException: Unable to locate a login configuration 
     at com.sun.security.auth.login.ConfigFile.init(ConfigFile.java:250) [na:1.6.0_22] 
     at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:91) [na:1.6.0_22] 
     ... 27 common frames omitted 

另外,這裏是red5-web.properties的

webapp.contextPath=/project 

即使配置futher信息:像它使用的是正確的境界

在我看來:MemoryRealm

[INFO] [main] org.red5.server.tomcat.TomcatLoader - Setting connector: org.apache.catalina.connector.Connector 
[INFO] [main] org.red5.server.tomcat.TomcatLoader - Address to bind: /127.0.0.1:5080 
[INFO] [main] org.red5.server.tomcat.TomcatLoader - Setting realm: org.apache.catalina.realm.MemoryRealm 
[INFO] [main] org.red5.server.tomcat.TomcatLoader - Loading tomcat context 
[INFO] [main] org.red5.server.tomcat.TomcatLoader - Server root: C:/Program Files/Red5 
[INFO] [main] org.red5.server.tomcat.TomcatLoader - Config root: C:/Program Files/Red5/conf 
[INFO] [main] org.red5.server.tomcat.TomcatLoader - Application root: C:/Program Files/Red5/webapps 
[INFO] [main] org.red5.server.tomcat.TomcatLoader - Starting Tomcat servlet engine 
[INFO] [main] org.apache.catalina.startup.Embedded - Starting tomcat server 
[INFO] [main] org.apache.catalina.core.StandardEngine - Starting Servlet Engine: Apache Tomcat/6.0.26 

然而,的Bootstrap的Tomcat後,我出現以下錯誤:

Exception in thread "Launcher:/administration" org.springframework.beans.factory.BeanDefinitionStoreException: Could not resolve bean definition resource pattern [/WEB-INF/red5-*.xml]; nested exception is java.io.FileNotFoundException: ServletContext resource [/WEB-INF/] cannot be resolved to URL because it does not exist 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:190) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) 
     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124) 
     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93) 
     at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 
     at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:458) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:388) 
     at org.red5.server.tomcat.TomcatLoader$1.run(TomcatLoader.java:594) 
Caused by: java.io.FileNotFoundException: ServletContext resource [/WEB-INF/] cannot be resolved to URL because it does not exist 
     at org.springframework.web.context.support.ServletContextResource.getURL(ServletContextResource.java:132) 
     at org.springframework.core.io.support.PathMatchingResourcePatternResolver.isJarResource(PathMatchingResourcePatternResolver.java:414) 
     at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:343) 
     at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:282) 
     at org.springframework.context.support.AbstractApplicationContext.getResources(AbstractApplicationContext.java:1156) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:177) 
     ... 7 more 

此錯誤是有點兒奇怪,因爲在這之後似乎/ WEB-INF是的休息發現/

[INFO] [Launcher:/SOSample] org.springframework.beans.factory.config.PropertyPlaceholderConfigurer - Loading properties file from ServletContext resource [/WEB-INF/red5-web.properties] 
[INFO] [Launcher:/installer] org.springframework.beans.factory.config.PropertyPlaceholderConfigurer - Loading properties file from ServletContext resource [/WEB-INF/red5-web.properties] 
[INFO] [Launcher:/] org.springframework.beans.factory.config.PropertyPlaceholderConfigurer - Loading properties file from ServletContext resource [/WEB-INF/red5-web.properties] 
[INFO] [Launcher:/LiveMedia] org.springframework.beans.factory.config.PropertyPlaceholderConfigurer - Loading properties file from ServletContext resource [/WEB-INF/red5-web.properties] 

真正惹惱我是,你可以在輸出中看到的,當我嘗試登錄,我得到一個JAASRealm相關的異常,但在調試輸出時,Tomcat是:由下列輸出程序加載,我很清楚它期望一個MemoryRealm。我想知道在red5.xml中,在哪裏以及如何指定bean屬性,以便強制red5使用位於/conf/tomcat-users.xml下的MemoryRealm,因爲它現在肯定不會這樣做。

這似乎是我迄今發佈的最大問題,但我試圖儘可能全面地解釋它以避免混淆。

+0

不是你的問題的答案,但可能會幫助你到達那裏。似乎它正在尋找WEB-INF或其他意想不到的文件。既然你在Windows上......應該給Process Monitor一個試用和過濾WEB-INF。應該能夠看到你的配置文件是否被訪問/讀取,也應該能夠捕捉到任何失敗的讀取嘗試,指向你可能錯誤地嘗試讀取的任何地方。當然,如果它試圖從jar中讀取文件,它將毫無幫助。 -Good Luck – sbaker 2011-01-18 19:47:53

+0

好吧,我做到了,它似乎在red5 bootstraps後解析。但是,當我有客戶端登錄時,文件不會再被解析。你知道tomcat的內部嗎?每當客戶端嘗試進行身份驗證時應該解析文件,還是應該在部署應用程序時解析文件一次? – 2011-01-19 08:54:53

+0

嗨,我不是一個tomcat專家 - 但我希望文件在啓動時(或第一次登錄)最初被讀取,而不是在每次登錄嘗試時(只有在文件被更改時纔可能再次讀取)。您是否在Process Monitor中看到堆棧跟蹤中引用的WEB-INF目錄中的讀取嘗試失敗? – sbaker 2011-01-19 18:29:51

回答

2

對於Red5 0.9,請嘗試將此節點添加到您的tomcat.server bean。

<property name="realm"> 
    <bean class="org.apache.catalina.realm.MemoryRealm" lazy-init="true"> 
     <property name="pathname" value="conf/tomcat-users.xml" /> 
    </bean> 
</property> 

如果仍未找到的XML(嘗試一個完整路徑)或境界屬性不允許你設置的話,我建議你升級到1.0。

0

我已經多次看到這個問題,並且在我們的系統中,它通常隱藏了一個配置問題。你確定所有的相關路徑都已設置好,這樣你的所有庫都可以正常訪問嗎?

此外,資源模式語法似乎有點不對勁,您可以用所有文件的列表替換該配置設置嗎?