更新:我无法解决这里提出的问题,但我的问题最简单和最有效的解决方案是不使用内存中的 userDetailsService。我得到的解决方案的详细信息在后续帖子中。
概括
使用旧的 SpringSecurity.xml,我不需要通过内存中的 userDetailsService 提供密码来支持其他角色。非常方便,尤其是在开发阶段。
使用编程方法很容易提供用户名+密码+角色,但不清楚如何仅提供用户名+角色。我想学习如何。
例子
在下面的示例中,“用户”通过 adAuthProvider 在 Active Directory 中进行身份验证和授权。编程示例是 SecurityConfig configure(AuthenticationManagerBuilder auth) 方法的全部内容。
security.xml:(这工作了多年,我想复制什么)
<sec:user-service id="xmlUserDetailsService">
<sec:user name="user" authorities="ROLE_USER" />
</sec:user-service>
失败的编程尝试:(直接翻译上述内容,请注意“用户”没有设置密码......就像上面的 XML 一样)。服务器启动期间抛出:(org.springframework.beans.BeanInstantiationException:无法实例化 [javax.servlet.Filter]:工厂方法“springSecurityFilterChain”抛出异常;嵌套异常是 java.lang.IllegalArgumentException:无法将空值或空值传递给构造函数)
auth.authenticationProvider(adAuthProvider);
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder)
.withUser("user").roles("USER")
成功,为“用户”添加密码:(异常消失)
auth.authenticationProvider(adAuthProvider);
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder)
.withUser("user").password(passwordEncoder.encode("user")).roles("USER")
问题:
- 我假设 XML 和编程配置应该是等效的。因此,我假设有一种方法可以避免向内存中的 userDetails 提供密码。这个对吗?
- 假设上述情况属实,我该怎么做?您能否为整个方法提供一个示例?
我意识到这可能是一个微不足道的问题。我搜索并轻松查看了 100 个示例,但它们都包含密码。没有一个人展示了如何仅将内存用于授权 - 依靠 Active Directory 身份验证提供程序来验证密码。