Java 如何使用Spring正确获取用户列表?
我想获取所有经过身份验证的用户的列表。 我从spring官方网站上获取了基本的spring安全性 正如在其他相关问题()中建议的那样,我将DefaultSimpUserRegistry注入到代码中。 不过,这个列表还是空的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
@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();
}
在你的问题中,你尝试了几件事:
,其中包含一个允许的用户列表(在您的示例中是一个名为u
的用户)
SimpUserRegistry
获取通过Spring消息传递(例如使用WebSocket)连接的所有用户的列表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();
}