springsecurity踢出指定用户
springsecurity中可以使用 sessionregistry 的实现类 sessionregistryimpl 来获取session相关信息,可以通过这个实现类来踢出用户。
springsecurity配置
@enablewebsecurity
public class securityconfig extends websecurityconfigureradapter {
@autowired
isysuserservice userservice;
@override
protected void configure(httpsecurity http) throws exception {
http.authorizerequests()
.antmatchers("/webjars/**","/asserts/**","/login").permitall()
.anyrequest().authenticated()
.and()
.formlogin()
.loginpage("/login")
.loginprocessingurl("/loginpost")
.failureurl("/login?error=true")
.defaultsuccessurl("/index")
.and()
.logout()
.logouturl("/logout")
.addlogouthandler(new mylogouthandler())
.logoutsuccessurl("/login")
.and()
.rememberme()
.userdetailsservice(userservice)
.tokenrepository(jdbctokenrepository())
//保存登录状态时间,单位是秒
.tokenvalidityseconds(60*60*3)
.and()
//关闭请求头中的frame选项,不限制iframe
.headers().frameoptions().disable()
//关闭跨域
.and().csrf().disable()
.sessionmanagement()
//无效session跳转
.invalidsessionurl("/login")
//同时登陆多个只保留一个
.maximumsessions(1)
//过期session跳转
.expiredurl("/login")
.sessionregistry(sessionregistry());
}
/** 注册sessionregistry*/
@bean
public sessionregistry sessionregistry(){
return new sessionregistryimpl();
}
控制器
/** 踢出用户 */
@preauthorize("hasrole('管理员')")
@getmapping("/logout/{id}")
@responsebody
public string logout(@pathvariable long id) throws nosuchfieldexception {
//通过id查询用户
sysuser sysuser = userservice.selectuserbyuserid(id);
//获取所有principal信息
list<object> allprincipals = sessionregistry.getallprincipals();
for (object allprincipal : allprincipals) {
user user=(user)allprincipal;
//判断是否跟传递的id所找到的用户登录名一致
if(user.getusername().equals(sysuser.getloginname())){
list<sessioninformation> allsessions = sessionregistry.getallsessions(allprincipal, false);
for (sessioninformation session : allsessions) {
//使当前session过期
session.expirenow();
}
}
}
return "ok";
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论