接上文 《Spring Boot 注册登录demo 使用Spring Security和发送短信验证码》
我在我的Web应用程序中使用spring security,现在我想要列出所有登录我程序的用户.
我怎样才能访问该列表?它们不是已经存在于spring框架内的某个地方吗?像SecurityContextHolder或SecurityContextRepository?
下面就说我怎么搞的。
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
2、配置类configure 方法中增加如下配置
http.sessionManagement()
// 设置 Session 会话失效时重定向路径,默认为 loginPage()
// .invalidSessionUrl("/login")
// 配置使用自定义的 Session 会话失效处理策略
//.invalidSessionStrategy(invalidSessionStrategy)
// 设置单用户的 Session 最大并发会话数量,-1 表示不受限制
.maximumSessions(1)
// 设置为 true,表示某用户达到最大会话并发数后,新会话请求会被拒绝登录
.maxSessionsPreventsLogin(true)
// 设置所要使用的 sessionRegistry,默认为 SessionRegistryImpl 实现类
.sessionRegistry(sessionRegistry());
上面这两个在同一个配置类里面,完整的配置类 可以看后面源码 。
3、获取所有的登录用户import com.king.security.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author: 12613
* @project: springboot
* @pcakage: com.king.security.service.LoginUserServiceImpl
* @date: 2022年05月05日 21:33
* @description: ${}
*/
@Service
public class LoginUserServiceImpl {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
SessionRegistry sessionRegistry;
public List<User> getLoginUser() {
List<Object> list = sessionRegistry.getAllPrincipals();
logger.info("在线人数=[{}]", list.size());
List<User> userList = new ArrayList<>();
for (Object o : list) {
if (o instanceof User) {
User user = (User) o;
userList.add(user);
}
}
return userList;
}
}
4、写个接口测试一下
import com.king.security.service.LoginUserServiceImpl;
import com.king.security.vo.ResultObj;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: 12613
* @project: springboot
* @pcakage: com.king.security.controller.LoginUserController
* @date: 2022年05月05日 21:38
* @description: ${}
*/
@RestController
@RequestMapping("/api/loginUser")
@Api(value = "获取全部登录用户", tags = "获取全部登录用户")
public class LoginUserController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private LoginUserServiceImpl loginUserService;
@ApiOperation("获取全部登录用户")
@GetMapping("/getAllLoginUser.do")
public ResultObj getAllLoginUser() {
return ResultObj.ok(loginUserService.getLoginUser());
}
}
5、测试结果
Github https://github.com/KingJin-web/springboot
Gitee https://gitee.com/KingJin-web/springboot
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)