在其他应用

时间:2018-06-05 06:23:39

标签: spring spring-boot spring-session

我有两个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() + "';");
    }

0 个答案:

没有答案