是否可以进行可选的kerberos身份验证?
我想要的是:如果客户端(浏览器)不在域上,则会将其重定向到用户名/密码Web登录。否则它将执行SPNEGO执行Kerberos身份验证。
这有什么解决方案吗?如果是,我们需要哪些配置?
答案 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:
<?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>
[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