首先需要创建一个过滤器用来过滤第三方平台的Token
/**
* 第三方平台token过滤器 验证token有效性
*/
@Component
public class ExternalTokenFilter extends OncePerRequestFilter {
@Autowired
private TokenService tokenService;
@Autowired
private ISysConfigService sysConfigService;
// 在访问接口前会先走该方法
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
// 从头部获取token
String token = request.getHeader("External-Token");
// 判断是否为空
if (externalToken != null) {
// 校验通过,获取其他平台的用户信息
LoginUser loginUser = parseExternalUserInfo(token);
// 创建一个UsernamePasswordAuthenticationToken对象,用于存储用户的认证信息
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
// 设置authenticationToken的详细信息,包括请求的来源等
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
// 将authenticationToken设置到SecurityContextHolder中,以便后续的安全操作可以使用该认证信息
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
chain.doFilter(request, response);
}
// 自定义的处理其他逻辑的方法可有可无
// 这里的 LoginUser 就是自定义的一个对象
private LoginUser parseExternalUserInfo(String token) {
// 在这里解析或获取其他平台的用户信息,将其转换为LoginUser对象
// ...
}
}
下面则是需要在SecurityConfig这个配置文件中去配置该过滤器
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ExternalTokenFilter externalTokenFilter;
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
// 添加filter
httpSecurity.addFilterBefore(externalTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 若已有处理TOKEN的filter则可以这样写 假设已有的名称为 tokenFilter
// httpSecurity.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
// 这个意思就是先走 externalTokenFilter 过滤器然后在走 tokenFilter 过滤器
// 若不配置则配置了哪一个就先运行哪一个
// httpSecurity.addFilterBefore(externalTokenFilter, TokenFilter.class);
}
}
至此则是配置完成,接下来就是根据每个项目的不同来进行细节的改变
就比如需要第三方平台的用户信息与本平台的字段对应不上或其他问题来进行修改