0

这是我的问题:

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

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

系统配置

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

API 休息配置

我正在使用 github 上的 spring 安全示例,您可以在此处找到:

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

我知道有一个入口点,这在我的上下文中不需要(API Rest)。我选择了这个示例,因为它似乎使用了 windows 身份验证上下文并使用它在 spring 安全上下文中自动对我进行身份验证。紧接着,发送一个 ldap 请求以提取有关登录用户的所有信息。就我而言,我需要提取组。

我也在使用:

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

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

我不确定这是否是做我想做的事情的正确方法。

我的身份验证似乎失败了,我的日志中只有一件事出错了..

“未设置属性 'userDn' - 匿名上下文将用于读写操作”

问题

  1. 我必须使用 tomcat 帐户运行我的 tomcat 服务吗?(似乎是,是的)
  2. 我是否使用 Kerberos 安全性做正确的事情?
  3. 如何摆脱匿名上下文?
  4. 匿名上下文似乎是在 Tomcat 启动后立即设置的。我想在我的用户(例如,user1)请求其余 API(EntryPoint 或其他)之后获取上下文

如果有不清楚的地方告诉我,我会尝试重新制定!

谢谢,

4

2 回答 2

1

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

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

如果您仍想查询 LDAP,则需要先在 LDAP 中进行身份验证,然后才能进行任何查询。同样,无需为此使用最终用户帐户 - 您可以使用 keytab 文件在 LDAP 中进行 Kerberos 身份验证,并使用“Tomcat”帐户查询组

于 2018-06-02T17:16:25.337 回答
0

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

在 REST API 上下文中,您没有入口点。我试图将我的入口点设置为一个未映射的 URL,只是为了进行协商。通过这样做,您将收到带有错误代码 404(未找到)的 HTTP 响应,但 Spring Security(WWW-Authenticate)添加了正确的标头。

如果错误代码不是 401,Web 浏览器将不会发送票务服务。

要解决此问题,您必须创建一个CustomEntryPoint类(实现 AuthenticationEntryPoint),并且您需要重写“commence”方法以返回带有正确标头的 401 HTTP 代码。

我希望这会有所帮助。如果有更好的方法,请告诉我!

于 2018-06-07T11:30:02.473 回答