真的把这头发撕掉了。我有一个为我的Spring webapp配置的JAAS身份验证提供程序。我为它创建了一个bean定义,如下所示:
<beans:bean id="jaasAuthenticationProvider"
class="org.springframework.security.providers.jaas.JaasAuthenticationProvider">
<custom-authentication-provider />
<beans:property name="loginConfig" value="file:webapps/mywebapp/WEB-INF/login.conf"/>
<beans:property name="loginContextName" value="myWebapp"/>
<beans:property name="callbackHandlers">
<beans:list>
<beans:bean class="org.springframework.security.providers.jaas.JaasNameCallbackHandler"/>
<beans:bean class="org.springframework.security.providers.jaas.JaasPasswordCallbackHandler"/>
</beans:list>
</beans:property>
</beans:bean>
我的JAAS的login.conf文件:
myWebapp {
com.sun.security.auth.module.Krb5LoginModule
required
doNotPrompt=false
useTicketCache=true
debug=true;
};
com.sun.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule
required;
};
当Spring初始化时,它正确配置bean。但是,当我尝试登录我的webapp时,出现以下错误:
DEBUG webapp.AuthenticationProcessingFilter - Authentication request failed: org.springframework.security.AuthenticationServiceException: I/O error while reading configuration file.; nested exception is javax.security.auth.login.LoginException: I/O error while reading configuration file.
我在Spring源代码中的任何地方都找不到此错误消息,并且错误消息本身根本没用。知道是什么导致了这个吗?
答案 0 :(得分:1)
将文件放在类路径上,而不是尝试从WEB-INF目录中读取它。 /webapps/myapp/WEB-INF/classes/login.conf - 然后在你的Spring配置中将行改为:
<beans:property name="loginConfig" value="classpath:login.conf"/>
我认为您没有收到Spring错误,但是如果遇到文件系统/ java错误,则不允许您从WEB-INF目录中读取。
答案 1 :(得分:0)
找到答案。 JAAS实际上正确加载了配置文件,但我在本地JDK中缺少krb5.conf文件。此文件必须存在于:
$JAVA_HOME/lib/security
示例:
[libdefaults]
default_realm = DOMAIN.NET
dns_lookup_kdc = true
[domain_realm]
.domain.net = DOMAIN.NET
其中domain.net是Kerberos域的名称,DOMAIN.NET只是大写的。