在春季安全性中列出内存中的用户



或更具体地说,是否可能

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

是的,您实际上可以使用带有Java反射的杂耍表演访问它,您可以在其中访问未通过公共API暴露的属性。我已经在春季的重新安置下使用了,如果您使用的是弹簧,则应可用(因为它是弹簧安全性的)。关键是通过自动启动获得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。您可以在下面看到程序的输出。您可以从此地图中获取所需的信息。

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

最新更新