当前位置: 首页 > 知识库问答 >
问题:

Spring Security多个登录用户失败

甄坚白
2023-03-14

我正在用Spring、Spring Security和Hibernate制作一个基本的Tic-tac-toe项目。该应用程序可以为数据库中的每个登录用户保存游戏,并允许我们随时加载它。这不是问题,但在涉及多线程时会出现问题。当我在单个浏览器窗口中运行单个应用程序时,一切都很好。但当我打开另一个窗口时,两个玩家正在玩同一个游戏。

我知道这可能是由Spring创建的bean单例引起的,但我确信不是。为了检查当前登录的用户,我做了一个从SecurityContextHolder获取他的方法

private User getUserFromSpringContext() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    String name = authentication.getName();
    System.out.println("Currently logged users = " + name);
    return userService.findUserByUsername(name);
}

当多个用户登录时,该方法只会打印其中一个用户的名称。我不知道为什么。以下是我的安全配置和user详细信息类的一些重要代码行:

安全配置

@Autowired
UserDetailsService userDetailsService;

@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder builder) throws Exception {
    builder.userDetailsService(userDetailsService);
    builder.authenticationProvider(authenticationProvider());
}

@Bean
public DaoAuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
    auth.setUserDetailsService(userDetailsService);
    return auth;
}

自定义用户详细信息服务

@Autowired
private UserService userService;

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = userService.findUserByUsername(username);
    if (user == null) {
        throw new UsernameNotFoundException("Username not found");
    }
    return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), true, true, true, true, getAuthoriries(user));
}

public void setUserService(UserService userService) {
    this.userService = userService;
}

private List<GrantedAuthority> getAuthoriries(User user) {
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority(user.getRole().getRole()));
    return authorities;
}

有人知道这个问题的原因吗?

在测试期间,我发现了另一个问题。当我单击注销时,所有用户都已注销。我在这里发布了我的Spring Security配置的其余部分。

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/start", "/", "/login", "/registry","/success","/new").permitAll()
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .antMatchers("/**").access("hasAnyRole('ROLE_USER','ROLE_ADMIN')")
            .and().formLogin().loginPage("/login").defaultSuccessUrl("/user")
            .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .and().csrf()
            .and().exceptionHandling().accessDeniedPage("/access_denied");
}

有什么问题?

共有1个答案

督坚白
2023-03-14

通过SecurityContextHolder,您可以访问与当前线程关联的安全上下文,因此只有当前用户,即其请求触发了对getAuthentication()调用的用户,因此它的行为完全符合其应有的方式。

另一方面,如果您想要所有活动会话(即所有登录用户),则应插入会话注册表(SessionRegistry)并调用会话注册表(SessionRegistry)。GetAllPrinciples()。

这里已经给出了详细信息。

 类似资料:
  • 我对Spring Security配置有问题。 当我以用户1身份登录一台计算机,然后我将以用户2身份登录另一台计算机时,刷新后的第一台计算机将所有内容都视为用户2。 换句话说,不可能同时与不同的用户进行两次会话。 配置: Spring Security版本:4.0.1。发布 Spring版本:4.1.6。发布 控制器中的登录请求:

  • 问题内容: 我无法摆脱这个错误。我已经通过SSMS添加了“ NT AUTHORITY \ NETWORK”用户以及使用此线程作为参考的相关角色:用户“ NT AUTHORITY \ NETWORKSERVICE”的登录失败 我试图通过Windows服务建立数据库连接。在调试模式下,数据库连接可以正常工作。当我实际尝试运行已安装的服务时,便会出现此错误。 这是我来自app.config的连接字符串:

  • 目前,我正在使用以下内容将用户登录到我的应用程序中。然而,我想使用一个角函数来实际执行登录。为此,我想创建一个Rest网络服务来进行身份验证,但是我在SO上看到的所有示例都使用我认为被贬低的用户。我还希望该服务返回有关用户的信息。 我要问的是如何将MyUserDetailsService更改为用作登录的restful服务,或者如何创建一个可用于登录的服务,该服务将在登录后返回用户对象。 这是我的a

  • null 服务器类型:数据库引擎 服务器名称:Desktop-6u7r1ac\sqlExpress 身份验证:Windows身份验证 用户名:desktop-6u7r1ac\amit 密码: 我得到以下错误- 线程“main”com.microsoft.sqlserver.jdbc.sqlserverexception中出现异常:用户“desktop-6u7r1ac\amit”登录失败。Clien

  • 一、检查服务器是否填写了DNS,即服务器是否能上网访问www.phpcms.cn。有部分用户是本机通信失败,检查C:\WINDOWS\system32\drivers\etc\hosts文件,如果用的是localhost域名访问,本机是否绑定了127.0.0.1 localhost 二、检查phpsso的访问地址是否正确,然后查看设置->phpsso设置中的应用id、接口地址、加密密钥、版本号和

  • 问题内容: 我试图测试与本地sql DB的连接。我有这个代码: 我尝试了很多用户。我的Windows用户是SOSCOMP,没有密码。我也知道SQL 2008将用户创建为“ sys”“ dbo”,我也尝试过这些。我总是得到: 有任何想法吗? 谢谢 问题答案: 如果尝试连接使用Windows身份验证的数据库,则可以在连接字符串中使用“ integratedSecurity”选项。