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

时间:2017-09-18 07:47:07

标签: java spring-security

或者更具体地说,是否可能

我们目前使用XML配置将用户留在内存中。我们知道InMemoryUserDetailsManager,但遗憾的是,无法获取所有用户,而users内的InMemoryUserDetailsManager地图是私有的。

1 个答案:

答案 0 :(得分:1)

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

只是为了证明我已经在Spring Boot App上测试了这个,但是如果你没有使用它,那么应该没有任何问题。

@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.springframework.security.provisioning.MutableUser@6edaa77a}