这是我的问题:
上下文: -Windows Server 2012 with ActiveDirectory -Tomcat -Rest API(Spring)
我目前正在尝试限制REST请求。我希望只有AD的特定组才能访问特定资源。我受限于Kerberos身份验证。
系统配置
API休息配置
我在github上使用spring security示例,你可以在这里找到:
我知道有一个EntryPoint,在我的上下文中不需要这个(API Rest)。我选择了此示例,因为它似乎使用了Windows身份验证上下文并使用它在spring安全上下文中自动验证我。之后,发送ldap请求以提取有关所记录用户的所有信息。在我的情况下,我需要提取组。
我也在使用:
https://github.com/GyllingSW/kerberos-demo
使用类" RoleStrippingLdapUserDetailsMapper.java"提取用户的角色。而不是" ActiveDirectoryLdapAuthoritiesPopulator"。此实现还提供localhost身份验证,但NTLM令牌的问题似乎在最后一次提交spring security时得到修复。
我不确定这是否是我想要的正确方法。
我的身份验证似乎失败了,我的日志中只出现了一个问题..
" Property' userDn'未设置 - 匿名上下文将用于读写操作"
问题
如果有什么不清楚让我知道,我会尝试重新制定!
谢谢,
答案 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代码。
我希望这可以提供帮助。如果有更好的方法,请告诉我!