1

真的把我的头发扯掉了。我为我的 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。但是,当我尝试登录我的 web 应用程序时,我收到以下错误:

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 源代码的任何地方都找不到这个错误消息,而且错误消息本身根本没有帮助。知道是什么原因造成的吗?

4

2 回答 2

1

将您的文件放在类路径上,而不是尝试从 WEB-INF 目录中读取它。/webapps/myapp/WEB-INF/classes/login.conf - 然后在您的 Spring 配置中将行更改为:

    <beans:property name="loginConfig" value="classpath:login.conf"/>

我不认为您收到 Spring 错误,而是收到文件系统/java 错误,不允许您从目录 WEB-INF 中读取。

于 2009-06-30T20:00:01.267 回答
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 相同,只是大写。

于 2009-06-30T20:32:26.443 回答