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"; }
到此这篇关于springsecurity踢出指定用户的文章就介绍到这了,更多相关springsecurity踢出指定用户内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论