Spring Security:无法让真正的用户使用显示过期的 SessionRegistry 登录

Posted

技术标签:

【中文标题】Spring Security:无法让真正的用户使用显示过期的 SessionRegistry 登录【英文标题】:Spring Security: Cant get really users logged in using SessionRegistry that shows expired ones 【发布时间】:2020-04-24 08:19:31 【问题描述】:

也许应该配置会话过期时间或错误在我的代码中?

我的控制器代码片段。 即使已注销,它也会显示用户名。

@GetMapping("/")
  public String getProfilePage(Model model, Authentication authentication) 
    if (authentication == null) 
      return "redirect:/login";
    
    UserDetailsImpl details = (UserDetailsImpl) authentication.getPrincipal();
    model.addAttribute("user", details.getUser());
    model.addAttribute("greeting", details.getUser().getGreeting());
    List<UserDetails> lu = sessionRegistry.getAllPrincipals()
        .stream()
        .filter(principal -> principal instanceof UserDetails)
        .map(UserDetails.class::cast)
        .collect(Collectors.toList());
    for (UserDetails l: lu)
      System.out.println(l.getUsername());
    
    return "Profile";
  

一个星期都解决不了这个问题。 有一些答案Here 但它没有帮助解决我的问题。

【问题讨论】:

【参考方案1】:

这就是我的 SecurityConfig 类的样子:

public class SecurityConfig extends WebSecurityConfigurerAdapter 

  @Qualifier("dataSource")
  @Autowired
  private DataSource dataSource;

  @Autowired
  private PasswordEncoder passwordEncoder;

  @Autowired
  private UserDetailsService userDetailsServiceImpl;

  @Override
  protected void configure(HttpSecurity http) throws Exception 

    http
        .authorizeRequests()
        .antMatchers("/expired").permitAll()
        .antMatchers("/static/**").permitAll()
        .antMatchers("/users").hasAnyAuthority("ADMIN")
        .anyRequest().permitAll()
        .and()
        .formLogin().loginPage("/login")
        .usernameParameter("login")
        .passwordParameter("password")
        .failureUrl("/login?error").permitAll()
        .defaultSuccessUrl("/")
        .and()
        .rememberMe()
        .rememberMeParameter("remember-me")
        .tokenRepository(tokenRepository())
        .and()
        .logout()
        .deleteCookies("remember-me")
        .logoutUrl("/logout")
        .logoutSuccessUrl("/login")
        .permitAll();
    http.csrf().disable();
    http
        .sessionManagement()
        .maximumSessions(1)
//        .maxSessionsPreventsLogin(false)
        .sessionRegistry(sessionRegistryImpl());
  

  @Bean
  public SessionRegistryImpl sessionRegistryImpl() 
    return new SessionRegistryImpl();
  

  @Bean
  public HttpSessionEventPublisher httpSessionEventPublisher() 
    return new HttpSessionEventPublisher();
  

  @Bean
  public PersistentTokenRepository tokenRepository() 
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
    tokenRepository.setDataSource(dataSource);
    return tokenRepository;
  

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception 
    auth.userDetailsService(userDetailsServiceImpl).passwordEncoder(passwordEncoder);
  

并添加了 AppInitializer:

@Configuration
public class AppInitializer implements WebApplicationInitializer 

  @Override
  public void onStartup(ServletContext servletContext) throws ServletException 
    servletContext.addListener(HttpSessionEventPublisher.class);
  

【讨论】:

以上是关于Spring Security:无法让真正的用户使用显示过期的 SessionRegistry 登录的主要内容,如果未能解决你的问题,请参考以下文章

登录时更改spring security中的用户名

Spring security“forward:”指令无法转发到登录表单

Spring security“forward:”指令无法转发到登录表单

Spring security:如果用户不满足特定条件,则使每个页面重定向

oauth2 spring security with spring session 使那些不活动 30 分钟的用户无效

Spring Security:如何让用户打开任何页面的监听器?