java - 在 Spring Security 中列出内存中的用户?

标签 java spring-security

或者更具体地说,有可能吗?

我们目前使用 XML 配置将我们的用户存储在内存中。我们知道 InMemoryUserDetailsManager,但不幸的是,不可能获取所有用户,而且 InMemoryUserDetailsManager 中的 users 映射是私有(private)的。

最佳答案

是的,您实际上可以使用一些 Java 反射来访问它,您可以在其中访问未通过公共(public) API 公开的属性。 我在RelectionUtils下面用过来自 Spring,如果您使用的是 Spring(因为它是 Spring 安全性,所以应该可用)。 关键是通过 Autowiring 获取 AuthenticationManager,然后深入到包含用户信息的所需 Map

只是为了演示,我已经在 Spring Boot 应用程序上对此进行了测试,但如果您不使用它,应该不会有任何问题。

@SpringBootApplication
public class SpringBootSecurityInMemoryApplication implements CommandLineRunner {

     @Autowired AuthenticationManager authenticationManager;

................................
...............................
public static void main(String[] args) {
        SpringApplication.run(SpringBootSecurityInMemoryApplication.class, args);
    }

@Override
    public void run(String... args) throws Exception {      
        introspectBean(authenticationManager);


    }

public void printUsersMap(Object bean){

        Field field = ReflectionUtils.findField(org.springframework.security.authentication.ProviderManager.class, "providers");
        ReflectionUtils.makeAccessible(field);
        List listOfProviders = (List)ReflectionUtils.getField(field, bean);     
        DaoAuthenticationProvider dao = (DaoAuthenticationProvider)listOfProviders.get(0);
        Field fieldUserDetailService = ReflectionUtils.findField(DaoAuthenticationProvider.class, "userDetailsService");
        ReflectionUtils.makeAccessible(fieldUserDetailService);
        InMemoryUserDetailsManager userDet = (InMemoryUserDetailsManager)(ReflectionUtils.getField(fieldUserDetailService, dao));
        Field usersMapField = ReflectionUtils.findField(InMemoryUserDetailsManager.class, "users");
        ReflectionUtils.makeAccessible(usersMapField);
        Map map = (Map)ReflectionUtils.getField(usersMapField, userDet);
        System.out.println(map);

    }

我配置了 2 个用户 - shailendra 和 admin。您可以在下面看到程序的输出。您可以从这张 map 中获取所需的信息。

{shailendra=org.springframework.security.provisioning.MutableUser@245a060f, admin=org.springframework.security.provisioning.MutableUser@6edaa77a}

关于java - 在 Spring Security 中列出内存中的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46274129/

相关文章:

java - 亚马逊网络服务 (AWS) Cognito 错误 "Token is not from a supported provider of this identity pool."

java - 简单递归解释

spring - 在 Spring Security OAuth2(提供者)中使用作用域作为角色

java - 在 Spring Security 中以编程方式设置登录 URL

Spring安全标签库

java - Spring MVC @ModelAttribute 作为方法参数注解

java - 如何使这个非阻塞服务器成为多线程的?

spring - 多个客户端ID Spring 安全配置

java - Vaadin Spring PLupload-Addon 上传文件失败

java - 使用 UserDetailsS​​ervice 的 Spring Security 身份验证