可选的kerberos身份验证?

时间:2014-02-27 10:47:31

标签: kerberos spring-security-kerberos

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

在我看来,上面看起来有些倒退,并且在不严格必要的情况下添加JavaScript要求是令人反感的。我认为EliasMårtenson的答案是正确的 - 尝试Kerberos并回归到HTTP 401响应中的带内登录 - 但是否可能取决于您的环境。

答案 2 :(得分:0)

如果您需要在服务器收到未经身份验证的请求后重定向到登录页面(如EliasMå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 - 生成的密钥表文件(请参阅MIKE WIESNER blogLior Chaga experience
  • 小心使用 keyTabLocation 属性,它不是.keytab文件的路径,它是.keytab文件的URL,所以使用 file:/ 来定位
  • krbConfLocation - 系统上kerberos配置文件 krb5.conf 的路径
  • customUserDetailsS​​ervice - 您的自定义detailService
  • 不要忘记在生产中将属性调试设置为false