gpt4 book ai didi

java - 如何将自定义权限填充器与 Spring Security 和 ActiveDirectoryLdapAuthenticationProvider 一起使用?

转载 作者:IT老高 更新时间:2023-10-28 13:50:08 24 4
gpt4 key购买 nike

我已通过 LDAP 成功连接到 Active Directory 以进行身份​​验证,并在我的 ldap.xml 中使用以下内容调用了我的自定义权限填充器:

    <bean id="ldapAuthenticationProvider"
class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg ref="ldapBindAuthenticator"/>
<constructor-arg ref="ldapAuthoritiesPopulator"/>
</bean>

<bean id="ldapBindAuthenticator"
class="org.springframework.security.ldap.authentication.BindAuthenticator">
<constructor-arg ref="ldapServer"/>
<property name="userSearch" ref="ldapSearch"/>
</bean>

<bean id="ldapSearch"
class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg value="CN=Users"/>
<constructor-arg value="(sAMAccountName={0})"/>
<constructor-arg ref="ldapServer"/>
</bean>

<bean id="ldapAuthoritiesPopulator"
class="my.project.package.ActiveDirectoryLdapAuthoritiesPopulator"/>

<bean id="ldapServer"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://192.168.0.2/dc=test,dc=server"/>

<property name="userDn" value="ldap@test.server"/>
<property name="password" value="ldap"/>
<property name="baseEnvironmentProperties">
<map>
<entry key="java.naming.referral">
<value>follow</value>
</entry>
</map>
</property>
</bean>

这很好用,我可以根据用户的组成员身份确定用户的授权,但我宁愿通过内置的 Active Directory LDAP 身份验证提供程序来做到这一点:

<bean id="ldapAuthenticationProvider"
class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">

<constructor-arg value="test.server"/>
<constructor-arg value="ldap://192.168.0.2:389"/>
<property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

上面的问题是我的自定义权限填充器(显然)没有被调用,所以虽然我可以验证我的用户(适用于上面),但我没有组(我需要确定授权) .

我觉得这是一个简单的问题,但在我的一生中,我无法在这里或其他任何地方找到答案。我是否必须扩展 ActiveDirectoryLdapAuthenticationProvider 类,并从那里调用我的权限填充器?

(感谢这个网站多年来为我提供的所有帮助;这个网站的有效性可以通过我最近才费心创建一个帐户这一事实来衡量,这是我的第一个问题。谢谢提前为您提供帮助。)

最佳答案

Spring 的 ActiveDirectoryLdapAuthenticationProvider 类是 final,所以我唯一真正的选择(如果有任何接受者,我会招待更好的)是 fork 该类。我复制并粘贴了它的内容,稍微重构,并删除了 final 名称。然后,我创建了 fork 类的单独子类,覆盖 loadUserAuthorities() 方法,并添加了我自己的代码来构建权限掩码。

然后我可以按如下方式编辑我的 ldap.xml 文件:

    <bean id="ldapAuthenticationProvider"
class="my.project.package.OverrideActiveDirectoryLdapAuthenticationProvider">
<constructor-arg value="test.server"/>
<constructor-arg value="ldap://192.168.0.2:389"/>
<property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

对于像我这样的任何其他 n00b,子类如下所示:

public class OverrideActiveDirectoryLdapAuthenticationProvider extends TestActiveDirectoryLdapAuthenticationProvider {

//my assignments

public OverrideActiveDirectoryLdapAuthenticationProvider(String domain,
String url) {
super(domain, url);
}

@Override
protected Collection<? extends GrantedAuthority> loadUserAuthorities(DirContextOperations userData, String username, String password) {
//original code with my own additions
//in my case, I injected code into the for(group : groups) loop
}

工作就像一个魅力。

非常感谢 zagyi 的帮助。

关于java - 如何将自定义权限填充器与 Spring Security 和 ActiveDirectoryLdapAuthenticationProvider 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16113115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com