7

是否可以进行可选的 kerberos 身份验证?

我想要的是:如果客户端(浏览器)不在域上,它将被重定向到用户名/密码 Web 登录。否则它将执行 SPNEGO 执行 Kerberos 身份验证。

有什么解决方案吗?如果是,我们需要哪些配置?

4

3 回答 3

4

是的。你可以这样做。当服务器接收到未经身份验证的请求时,它会回复 401(“需要授权”),这是一个WWW-Authenticate设置为Negotiate. 如果 Kerberos 身份验证失败,服务器也会返回 401。

每当客户端身份验证失败(例如,如果它没有任何 Kerberos 凭据,或者身份验证失败),就会显示 401 页面内容。

因此,要解决您的问题,您所要做的就是在 401 页面上包含登录页面。

于 2014-03-06T04:02:34.153 回答
0

如果您使用的是 Apache,则可以调整Cosign模块以使用(正常的、带内身份验证)登录页面上的一些 JavaScript 以及通过 Kerberos 身份验证的登录控制器的第二个路径来执行此操作。“常规”登录表单测试访问受 Kerberos 保护的资源是否成功,如果成功则重定向浏览器以自动完成登录。

在我看来,上述内容似乎有点倒退,并且在并非绝对必要的情况下添加 JavaScript 要求是令人反感的。我认为 Elias Mårtenson 的回答是正确的 - 尝试 Kerberos 并在 HTTP 401 响应中回退到带内登录 - 但是否可能取决于您的环境。

于 2014-05-06T20:32:16.253 回答
0

如果您需要在服务器收到未经身份验证的请求后重定向到登录页面(如 Elias Mårtenson 所说),您需要像这样配置 spring security:

springSecurity.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:sec="http://www.springframework.org/schema/security"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<sec:http entry-point-ref="spnegoEntryPoint" >
    <sec:custom-filter ref="spnegoAuthenticationProcessingFilter" position="BASIC_AUTH_FILTER" />
    <sec:form-login login-page="/login.xhtml" default-target-url="/index.xhtml" />
    <sec:access-denied-handler error-page="/login.xhtml" />
</sec:http>

<bean id="spnegoAuthenticationProcessingFilter" class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter"> 
    <property name="authenticationManager" ref="authenticationManager" />
</bean>

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider ref="kerberosServiceAuthenticationProvider" /> <!-- Used with SPNEGO -->
    <sec:authentication-provider ref="kerberosAuthenticationProvider"/> <!-- Used with form login -->
</sec:authentication-manager>

<bean id="kerberosAuthenticationProvider" class="org.springframework.security.extensions.kerberos.KerberosAuthenticationProvider">
    <property name="kerberosClient">
        <bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosClient">
            <property name="debug" value="true"/>
        </bean>
    </property>
    <property name="userDetailsService" ref="customUserDetailsService"/>
</bean>

<bean id="kerberosServiceAuthenticationProvider" class="ru.rfcfefa.epod.common.base.interceptor.CustomKerberosServiceAuthenticationProvider">
    <property name="ticketValidator">
        <bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator">
            <property name="servicePrincipal" value="HTTP/serverName.domain.local" />
            <!-- Setting keyTabLocation to a classpath resource will most likely not work in a Java EE application Server -->
            <!-- See the Javadoc for more information on that -->
            <property name="keyTabLocation" value="http-server.keytab" />
            <property name="debug" value="true" />
        </bean>
    </property>
    <property name="userDetailsService" ref="customUserDetailsService" />
</bean>

<bean class="org.springframework.security.extensions.kerberos.GlobalSunJaasKerberosConfig">
    <property name="debug" value="true" />
    <property name="krbConfLocation" value="krb5.conf"/>
</bean>
</beans>

krb5.conf

[libdefaults]
    default_realm = DOMAIN.LOCAL
    default_tkt_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    default_tgs_enctypes = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    permitted_enctypes   = aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc

[realms]
    DOMAIN.LOCAL  = {
        kdc = serverAD.domain.local 
        default_domain = DOMAIN.LOCAL
}

[domain_realm]
     .DOMAIN.LOCAL = DOMAIN.LOCAL

  • HTTP/serverName.domain.local - 服务主体名称
  • http-server.keytab - 生成的 keytab 文件(参见MIKE WIESNER 博客Lior Chaga 体验
  • 小心keyTabLocation属性,它不是 .keytab 文件的路径,它是 .keytab 文件的 URL,所以使用file:/来定位
  • krbConfLocation -系统上kerberos 配置文件krb5.conf的路径
  • customUserDetailsS​​ervice - 您的自定义 detailService
  • 不要忘记在生产中将属性debug设置为 false
于 2014-10-10T13:35:33.183 回答