0

更新:我无法解决这里提出的问题,但我的问题最简单和最有效的解决方案是不使用内存中的 userDetailsS​​ervice。我得到的解决方案的详细信息在后续帖子中。


概括

使用旧的 SpringSecurity.xml,我不需要通过内存中的 userDetailsS​​ervice 提供密码来支持其他角色。非常方便,尤其是在开发阶段。

使用编程方法很容易提供用户名+密码+角色,但不清楚如何提供用户名+角色。我想学习如何。

例子

在下面的示例中,“用户”通过 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")

问题:

  1. 我假设 XML 和编程配置应该是等效的。因此,我假设有一种方法可以避免向内存中的 userDetails 提供密码。这个对吗?
  2. 假设上述情况属实,我该怎么做?您能否为整个方法提供一个示例?

我意识到这可能是一个微不足道的问题。我搜索并轻松查看了 100 个示例,但它们都包含密码。没有一个人展示了如何仅将内存用于授权 - 依靠 Active Directory 身份验证提供程序来验证密码。

4

1 回答 1

0

我希望以下内容可以帮助下一个 googler 解决我的问题。

首先,我要感谢 Deinum,他让我朝着正确的方向思考。

只是在原始帖子的代码中添加使用虚拟密码不起作用,但这更适合我的需要:

  • 我已经在使用自定义 AuthenticationProvider。使用 JSON 语法从属性文件中的值中放置和读取用户的额外角色很容易: springsecurity.extraRoles=[{"username":"usernameValue", "roles":["ROLE_XTRA1", "ROLE_XTRA2" ]}]
  • 额外的角色很少更改,因此它们会被读取到静态 Map 中,并作为 authenticate() 过程的一部分添加到从 AD 检索到的用户角色中。
  • 因为我已经有了属性deploy.environment=DEV,所以我用它来禁用 PROD 中的机制。防止部署错误的安全网。

这个描述应该足够了,但是如果有人需要对任何步骤的更详细的解释,请告诉我。

于 2021-10-01T17:44:13.687 回答