Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring LDAP模板用于每个请求的用户身份验证_Spring_Spring Boot_Ldap_Spring Ldap_Ldap3 - Fatal编程技术网

Spring LDAP模板用于每个请求的用户身份验证

Spring LDAP模板用于每个请求的用户身份验证,spring,spring-boot,ldap,spring-ldap,ldap3,Spring,Spring Boot,Ldap,Spring Ldap,Ldap3,我有个难题 我正在实现一个服务客户机,其职责是在LDAP服务器上对用户进行身份验证。客户端接受用户ID和密码,确定用户DN,并调用对LDAP服务器的请求 我的问题是SpringLDAP模板目前的设置方式。LdapTemplate在bean creationtime需要一个ContextSource。ContextSource在创建时配置为某个值(ldapurl、userdn、密码)。但是我意识到我的ContextSource会随着每个用户的变化而变化。每个用户根据用户的DN打开一个连接。因此,我

我有个难题

我正在实现一个服务客户机,其职责是在LDAP服务器上对用户进行身份验证。客户端接受用户ID和密码,确定用户DN,并调用对LDAP服务器的请求

我的问题是SpringLDAP模板目前的设置方式。
LdapTemplate
在bean creationtime需要一个
ContextSource
ContextSource
在创建时配置为某个值(ldapurl、userdn、密码)。但是我意识到我的
ContextSource
会随着每个用户的变化而变化。每个用户根据用户的DN打开一个连接。因此,我的contextsource每个用户都不同,因此在创建时(容器启动)创建
contextsource
不是正确的位置。而且,无法通过
LdapTemplate
AFAIK覆盖
ContextSource
(使用用户名/密码)

那么,在我的代码中显式地创建一个Ldap
ContextSource
对象,通过使用实际的用户ID和密码(其url对所有用户都是常量)显式地初始化它,并使用
LdapTemplate
的setter方法更新我的
LdapTemplate
bean,这是一个好主意吗?在客户端调用之后,我将通过将
ContextSource
设置为
null
来处理它(模板比操作更有效,因为它是spring容器中的一个bean。因此它可以被重用,因此上下文中以前的信息一定不可用。)

问题:
对于这个问题,还有其他解决方案吗?

改变一个由多个线程使用的单例bean是一个好主意吗。。。如果同时从10个线程更改源,会发生什么情况?。。。因此,这是一个好主意,不,不是。相反,在
ContextSource
上设置
AuthenticationSource
,默认使用硬编码实例。您可以使其能够从
ThreadLocal
检索用户/密码,或者如果您使用的是Spring Security(我建议您不要创建自己的解决方案)您可以使用
SpringSecurityAUthenticationSource
@M.Deinum阅读您关于模板是单例的评论后,我意识到这种方法可能是错误的选择。也就是说,模板在spring配置中声明,并由不同线程使用新的contextsource实例进行更新。事实上,如果这些线程同时工作,它们将访问相同的模板,该模板已由不同的线程使用各自版本的contextsource更新!不是要走的路。另一种方法是,ldaptemplate也可以在实现到ldapserver的连接的方法中定义/创建。ldaptemplate将不再是Springbean,而是由我的代码创建的。contextsource也是如此。除了您对AuthenticationSource的建议之外,还有其他解决方案吗?(如果不使用springsecurity)与其创建所有这些对象,
AuthenticationSource
是最简单的(除了使用springsecurity)。更改多线程使用的单例bean是一个好主意吗。。。如果同时从10个线程更改源,会发生什么情况?。。。因此,这是一个好主意,不,不是。相反,在
ContextSource
上设置
AuthenticationSource
,默认使用硬编码实例。您可以使其能够从
ThreadLocal
检索用户/密码,或者如果您使用的是Spring Security(我建议您不要创建自己的解决方案)您可以使用
SpringSecurityAUthenticationSource
@M.Deinum阅读您关于模板是单例的评论后,我意识到这种方法可能是错误的选择。也就是说,模板在spring配置中声明,并由不同线程使用新的contextsource实例进行更新。事实上,如果这些线程同时工作,它们将访问相同的模板,该模板已由不同的线程使用各自版本的contextsource更新!不是要走的路。另一种方法是,ldaptemplate也可以在实现到ldapserver的连接的方法中定义/创建。ldaptemplate将不再是Springbean,而是由我的代码创建的。contextsource也是如此。除了您对AuthenticationSource的建议之外,还有其他解决方案吗?(如果不使用springsecurity)除了使用springsecurity之外,
AuthenticationSource
不是创建所有这些对象,而是最简单的。