Spring Security + OAuth2
第一章 Spring Security 快速入门
第二章 Spring Security 自定义配置
第三章 Spring Security 前后端分离配置
第四章 Spring Security 身份认证
第五章 Spring Security 授权
第六章 OAuth2
1、用户认证信息
1.1、基本概念
在Spring Security框架中,SecurityContextHolder, SecurityContext, Authentication,Principal和Credential是一些与身份验证和授权相关的重要概念,它们之间的关系如下:
- SecurityContextHolder: SecurityContextHolder 是Spring Security存储已认证用户详细信息的地方
- SecurityContext:SecurityContext是从SecurityContextHolder获取的内容,包含当前已认证用户的Authentication信息。
- Authentication:Authentication 表示用户的身份认证信息。它包含了用户的Principal,Credential和Authority信息。
- Princial:表示用户的身份信息。它通常是一个表示用户的实体对象。
1.2、在Controller中获取用户信息
@RestController
public class IndexController {
@GetMapping("/")
public Map index(){
SecurityContext context=SecurityContextHolder.getContext();
Authentication authentication=context.getAuthentication();
Object principal=authentication.getPrincipal();
Object credentials=authentication.getCredentials();//脱敏
Collection<?extends GrantedAuthority> authorities=authentication.getAuthorities();
String name = authentication.getName();
HashMap result = new HashMap();
result.put("username",name);
result.put("authorities",authorities);
return result;
}
}
2、会话并发处理
后登录的账号会使先登录的账号失效。
2.1、实现处理器接口
实现接口SessionInformationExpiredStrategy
public class MySessionInformationExpiredStrategy implements SessionInformationExpiredStrategy {
@Override
public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {
//创建结果对象
HashMap result = new HashMap();
result.put("code",-1);
result.put("message","该账号已从其他设备登录");
//转换成json字符串
String json = JSON.toJSONString(result);
HttpServletResponse response = event.getResponse();
//返回响应
response.setContentType("application/json;charset=UTF-8");
response.getWriter().println(json);
}
}
2.2、SecurityFilterChain配置
在WebSecurityConfig中的SecurityFilterChain加入如下配置。
http.sessionManagement(session->{
session.maximumSessions(1).expiredSessionStrategy(new MySessionInformationExpiredStrategy());
});