Java 如何使用Spring Security通过InMemoryAuthentication登录自定义用户?

Java 如何使用Spring Security通过InMemoryAuthentication登录自定义用户?,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我有一个SpringMVCWeb应用程序,由SpringSecurity保护,我正在编写测试。我正在努力让Spring Security在其SecurityContextHolder中检索到我的一个(自定义)用户。 一旦我的用户“插入”(java配置)了: 然后,我可以创建相关的令牌(UsernamePasswordAuthenticationToken)并请求Spring使用该令牌对我的用户进行身份验证。问题在于Spring并没有检索到一个自定义的用户实例,而是检索到它的用户类的实例。当Spr

我有一个SpringMVCWeb应用程序,由SpringSecurity保护,我正在编写测试。我正在努力让Spring Security在其SecurityContextHolder中检索到我的一个(自定义)用户。 一旦我的用户“插入”(java配置)了:

然后,我可以创建相关的令牌(UsernamePasswordAuthenticationToken)并请求Spring使用该令牌对我的用户进行身份验证。问题在于Spring并没有检索到一个自定义的用户实例,而是检索到它的用户类的实例。当Spring通过以下方法(从Spring的InMemoryUserDetailsManager)查找此类用户时:

它使用我的配置提供的详细信息实例化一个新用户

我认为InMemoryUserDetailsManager直接返回通过“getUserDetailsService().createUser”调用发送给他的内容没有问题,但肯定有一个问题。。。
无论如何,我可能在这里做错了什么,知道吗?

就像建议的那样,我最终在MemoryUserDetailsManager中编写了一个自定义的
,我用它为我的Spring安全配置提供信息。

对任何想知道的人来说,这似乎是唯一的办法。

嗯,看起来你对此无能为力。在MemoryUserDetailsManager中编写自定义
是否是一个问题?不,这确实是我目前正在考虑的问题,但我不敢相信Spring的人没有增加通过InMemoryAuth检索自定义用户的可能性。您获得的用户类型取决于您使用的UserDetails服务。因此,我完全希望InMemoryUserDetails服务返回其用户对象的“版本”。我相信,在大多数情况下,人们编写自己的用户详细信息服务,或者至少在我所看到的所有例子中似乎都是这样。我完全同意你关于非测试案例的观点,但我认为InMemoryAuth是作为一个轻量级的解决方案用于测试目的的,它就像一个地图,从中可以铸造出任何类型的主体。请问你是怎么做到的这是吗?@Phong6698给你:再加上这一点,因为我也在努力实现这一点。即使使用createUser方法添加自定义UserDetails实现,默认的InMemoryUserDetailsManager始终返回org.springframework.security.core.UserDetails.User对象。看起来继续使用它的唯一方法是创建自己的副本,并返回实现。
auth.inMemoryAuthentication().getUserDetailsService().createUser(myCustomUser);
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDetails user = users.get(username.toLowerCase());

        if (user == null) {
            throw new UsernameNotFoundException(username);
        }

        return new User(user.getUsername(), user.getPassword(), user.isEnabled(), user.isAccountNonExpired(),
                user.isCredentialsNonExpired(), user.isAccountNonLocked(), user.getAuthorities());
    }