Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Spring正确获取用户列表?_Java_Spring_Spring Boot_Spring Security_Spring Messaging - Fatal编程技术网

Java 如何使用Spring正确获取用户列表?

Java 如何使用Spring正确获取用户列表?,java,spring,spring-boot,spring-security,spring-messaging,Java,Spring,Spring Boot,Spring Security,Spring Messaging,我想获取所有经过身份验证的用户的列表。 我从spring官方网站上获取了基本的spring安全性 正如在其他相关问题()中建议的那样,我将DefaultSimpUserRegistry注入到代码中。 不过,这个列表还是空的 @Configuration public class UsersConfig { final private SimpUserRegistry userRegistry = new DefaultSimpUserRegistry(); @Bean

我想获取所有经过身份验证的用户的列表。 我从spring官方网站上获取了基本的spring安全性

正如在其他相关问题()中建议的那样,我将DefaultSimpUserRegistry注入到代码中。 不过,这个列表还是空的

@Configuration
public class UsersConfig {
    final private SimpUserRegistry userRegistry = new DefaultSimpUserRegistry();

    @Bean
    @Primary
    public SimpUserRegistry userRegistry() {
        return userRegistry;
    }
}
构建jar,本地启动,登录,输入。结果:

完整代码可从Spring站点获取。 关于SimpUserRegistry的话题太少了,我找不到完整的例子。类似的帖子还没有回复(,)


对不起,我是Spring新手,SimpUserRegistry是使用Spring列出用户的正确方法吗?如果是,如何正确使用?谢谢。

加载类时,您的simpUserRegistry将为空。开始时,您将无法获得用户列表。使用USersConfig类调用userRegistry()方法,而不是在connectedEquipments()方法中调用simpUserRegistry。类似下面的代码

@GetMapping("/users")
public String connectedEquipments() {

    return userRegistry()
            .getUsers()
            .stream()
            .map(SimpUser::getName)
            .collect(Collectors.toList()).toString();
}

在你的问题中,你尝试了几件事:

  • 您正在MemoryUserDetailsManager中设置
    ,其中包含一个允许的用户列表(在您的示例中是一个名为
    u
    的用户)
  • 您正在使用
    SimpUserRegistry
    获取通过Spring消息传递(例如使用WebSocket)连接的所有用户的列表
  • 如果您只是试图获取所有用户的列表,而没有使用WebSocket,那么第二种方法将不起作用

    如果您试图获取存储在MemoryUserDetailsManager
    中的所有用户的列表,那么答案是无法获取该列表
    InMemoryUserDetailsManager
    使用内存中的
    Map
    存储所有用户,并且它不公开该列表

    如果您确实需要这样一个列表,则必须在内存中创建一个自定义的
    UserDetailsService
    ,例如:

    @服务
    公共类ListingMemoryUserDetails服务实现UserDetails服务{
    私人最终地图用户;
    公共列表MemoryUserDetailsService(){
    this.users=new HashMap();
    }
    公共列表MemoryUserDetails服务(UserDetails…UserDetails){
    this.users=流(userDetails)
    .collect(Collectors.toMap(UserDetails::getUsername,InMemoryUser::new));
    }
    公共集合getUserName(){
    返回用户
    .values()
    .stream()
    .map(InMemoryUser::getUsername)
    .collect(toList());
    }
    @凌驾
    public UserDetails loadUserByUsername(字符串用户名)引发UsernameNotFoundException{
    返回可选
    .ofNullable(users.get(username))
    .orelsetrow(()->new UsernameNotFoundException(“用户不存在”);
    }
    }
    
    在本例中,
    InMemoryUser
    UserDetails
    接口的实现。创建这样的自定义实现时,必须使用Spring Security对其进行配置:

    @覆盖
    受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{
    认证
    .userDetailsService(userDetailsService)
    .密码编码器(passwordEncoder);
    }
    

    或者,如果您对检索所有已创建会话的列表感兴趣,有一种更好的方法。首先,您必须创建一个
    SessionRegistry
    bean:

    @Bean
    公共会话注册表会话注册表(){
    返回新的SessionRegistryImpl();
    }
    
    然后,您必须配置Spring Security来设置会话,并使用您的
    SessionRegistry
    来实现这一点:

    @覆盖
    受保护的无效配置(HttpSecurity http)引发异常{
    http
    .授权请求()
    .antMatchers(“/”,“/home”).permitAll()
    .anyRequest().authenticated()
    .及()
    .formLogin()
    .loginPage(“/login”).permitAll()
    .及()
    .logout().permitAll()
    //添加如下内容:
    .会议管理()
    .最多会议(1)
    .sessionRegistry(sessionRegistry);
    }
    
    之后,您可以自动连线
    SessionRegistry
    ,并使用
    getAllPrincipals()
    方法:

    @GetMapping(“/users”)
    公共收集查找器(){
    返回会话注册表
    .getAllPrinciples()
    .stream()
    .map(this::getUsername)
    .flatMap(可选::流)
    .collect(toList());
    }
    私有可选getUsername(对象主体){
    if(UserDetails的主体实例){
    返回可选的.ofNullable(((UserDetails)principal.getUsername());
    }否则{
    返回可选的.empty();
    }
    }
    

    这将列出在应用程序中登录并拥有会话的所有用户的用户名。这还包括过期的会话,因此您可能还需要对这些会话进行筛选。

    您是否试图获取当前与WebSocket连接的所有用户的列表,或者获取MemoryUserDetailsManager中
    中所有现有用户的列表?@g00glen00b根据,DefaultSimpUserRegistry跟踪已连接的websocket用户您是对的,但从您的问题来看,您似乎启动了应用程序,并立即希望用户可见。但是,如果在启动应用程序后没有建立WebSocket连接,那么该列表显然将为空。这就是为什么我要问你到底想看什么。谢谢你的提示g00glen00b,我会想出这个非常有用的!谢谢你明确的回答
    
    @RestController
    public class WebSocketController {
    
        @Autowired
        private final SimpUserRegistry simpUserRegistry;
    
        public WebSocketController(SimpUserRegistry simpUserRegistry) {
            this.simpUserRegistry = simpUserRegistry;
        }
    
        @GetMapping("/users")
        public String connectedEquipments() {
    
            return this.simpUserRegistry
                    .getUsers()
                    .stream()
                    .map(SimpUser::getName)
                    .collect(Collectors.toList()).toString();
        }
    }
    
    []
    
    @GetMapping("/users")
    public String connectedEquipments() {
    
        return userRegistry()
                .getUsers()
                .stream()
                .map(SimpUser::getName)
                .collect(Collectors.toList()).toString();
    }