我有一个使用Spring Security的Spring应用程序。具有ADMIN
角色的用户可以查看系统中注册的所有用户的列表,并可以禁用(暂停)任何用户(例如,如果违反了系统使用条款和条件)。如果用户如此禁用然后尝试登录,则会拒绝登录,因为他们的用户帐户已被禁用。
但是,如果禁用的用户在禁用其用户帐户时登录,则他们将继续使用该系统,直到他们注销或会话超时为止。
我们希望当管理员用户禁用某个用户帐户时,其帐户被禁用的用户必须无法进一步使用该系统,即使他们在禁用该帐户时已登录。
有没有办法通过Spring Security实现这一目标?
答案 0 :(得分:1)
如果(user.isDisabled()){
List principal = sessionRegistry.getAllPrincipals(); for(Object principal:principals){
AuthenticatedUser users =(AuthenticatedUser)principal;
String username= users.getUsername();
List<SessionInformation> sessionInformations = sessionRegistry.getAllSessions(users, false);
for(SessionInformation information : sessionInformations){
if(username.equalsIgnoreCase(user.getUserName())) {
information.expireNow();
}
}
}
}
答案 1 :(得分:0)
我们的系统中有类似的功能,如果用户在登录系统时更改了用户权限,则会强制用户再次登录。
我们已按如下方式实施:
我们使用分布式缓存,以便所有应用程序服务器维护相同的主体缓存,从而允许将请求路由到任何应用程序服务器而不会丢失功能。
存在用户未登录并且其访问权限被更改的情况,从而将其主体推送到缓存中。当用户下次登录时,过滤器在缓存中找到用户的主体,但发现缓存的时间戳早于会话开始时间,因此允许用户正常使用系统。