用于REST API的Spring Security Kerberos SSO(Tomcat)

时间:2018-06-01 18:37:08

标签: spring rest tomcat kerberos spring-security-kerberos

这是我的问题:

上下文: -Windows Server 2012 with ActiveDirectory -Tomcat -Rest API(Spring)

我目前正在尝试限制REST请求。我希望只有AD的特定组才能访问特定资源。我受限于Kerberos身份验证。

系统配置

  1. 在域中创建用户" Tomcat"
  2. setspn -a HTTP/apirest.domain@DOMAIN
  3. 使用ktpass
  4. 生成tomcat.keytab

    API休息配置

    我在github上使用spring security示例,你可以在这里找到:

    https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth

    我知道有一个EntryPoint,在我的上下文中不需要这个(API Rest)。我选择了此示例,因为它似乎使用了Windows身份验证上下文并使用它在spring安全上下文中自动验证我。之后,发送ldap请求以提取有关所记录用户的所有信息。在我的情况下,我需要提取组。

    我也在使用:

    https://github.com/GyllingSW/kerberos-demo

    使用类" RoleStrippingLdapUserDetailsMapper.java"提取用户的角色。而不是" ActiveDirectoryLdapAuthoritiesPopulator"。此实现还提供localhost身份验证,但NTLM令牌的问题似乎在最后一次提交spring security时得到修复。

    我不确定这是否是我想要的正确方法。

    我的身份验证似乎失败了,我的日志中只出现了一个问题..

    " Property' userDn'未设置 - 匿名上下文将用于读写操作"

    问题

    1. 我是否必须使用tomcat帐户运行我的tomcat服务? (似乎是,是的)
    2. 我是否使用Kerberos安全性做了正确的事情?
    3. 如何摆脱匿名背景?
    4. 匿名上下文似乎是在Tomcat启动后立即设置的。我希望在我的用户(例如,user1)请求其余API(EntryPoint或其他)之后获取上下文
    5. 如果有什么不清楚让我知道,我会尝试重新制定!

      谢谢,

2 个答案:

答案 0 :(得分:1)

您无需查询LDAP即可获取有关用户所属的组的信息。 Active Directory已将此信息添加到从浏览器发送到Tomcat的Kerberos票证。

您只需要从令牌中提取此信息,例如使用Kerb4J库。它带有受spring-security-kerberos项目启发的Spring集成,因此应该很容易切换到它。

如果您仍想查询LDAP,则需要先在LDAP中进行身份验证,然后才能进行任何查询。同样,不需要使用最终用户帐户 - 您可以使用Kerberos authentication in LDAP的密钥表文件和查询组使用" Tomcat"帐户

答案 1 :(得分:0)

我找到了解决问题的方法。

在REST API上下文中,您没有入口点。我试图将我的入口点设置为未映射的URL,只是为了进行协商。通过执行此操作,您将收到错误代码为404(未找到)的HTTP响应,但弹出安全性(WWW-Authenticate)添加了正确的标头。

如果错误代码不是401,则网络浏览器不会发送票证服务。

要解决此问题,您必须创建 CustomEntryPoint 类(实现AuthenticationEntryPoint ),并且您需要覆盖“开始”方法返回带有正确标题的401 HTTP代码。

我希望这可以提供帮助。如果有更好的方法,请告诉我!