我有两个Web门户,它们都在spring-boot上运行并使用相同的数据库,但它们是不同的模块并且是单独启动的。在该数据库中,每个门户网站都有自己的spring-session表(使用postgres),这些表是使用spring-session中的默认模式创建的,只是使用不同的表名。 现在我在一个门户中有管理员,他应该能够从另一个门户删除用户,并且需要使他们的会话无效。 在同一个门户网站中,我可以通过调用此方法来删除会话:
@Service
public class UserServiceImpl implements UserService {
@Autowired FindByIndexNameSessionRepository sessionRepository
public void expireSession(AbstractUser abstractUser) {
sessionRepository.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, abstractUser.getUsername()).keySet().forEach(id -> sessionRepository.delete((String) id));
}
}
要在另一个门户上过期会话,我正在考虑从该门户的会话表中按用户名删除所有行。这是一个很好的方法吗?也许我可以以某种方式从另一个应用程序中获取用户会话?
这来自我的http安全配置:
.and().sessionManagement()
.maximumSessions(1)
.sessionRegistry(sessionRegistry())
.maxSessionsPreventsLogin(true)
这是会话注册表:
@Bean
public SpringSessionBackedSessionRegistry sessionRegistry() {
return new SpringSessionBackedSessionRegistry(this.sessionRepository);
}
这在每个门户中使用(但具有不同的变量),因此spring-session知道要使用哪个表:
@Configuration
@EnableJdbcHttpSession(tableName = "${admin.portal.table-name}")
public class HttpSessionConfig {}
UPD: 我已经实现了一个我正在讨论的方法并进行了一些测试,看起来它的工作正常。
public void deleteResellerSession(AbstractUser user) {
jdbcTemplate.execute("DELETE FROM spring_session_portalB WHERE principal_name='" + user.getUsername() + "';");
}