Bootstrap

【Spring Security + OAuth2】身份认证

Spring Security + OAuth2

第一章 Spring Security 快速入门
第二章 Spring Security 自定义配置
第三章 Spring Security 前后端分离配置
第四章 Spring Security 身份认证
第五章 Spring Security 授权
第六章 OAuth2


1、用户认证信息

1.1、基本概念

在这里插入图片描述
在Spring Security框架中,SecurityContextHolder, SecurityContext, Authentication,Principal和Credential是一些与身份验证和授权相关的重要概念,它们之间的关系如下:

  1. SecurityContextHolder: SecurityContextHolder 是Spring Security存储已认证用户详细信息的地方
  2. SecurityContext:SecurityContext是从SecurityContextHolder获取的内容,包含当前已认证用户的Authentication信息。
  3. Authentication:Authentication 表示用户的身份认证信息。它包含了用户的Principal,Credential和Authority信息。
  4. 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());
 });
;