提交 0c53a315 作者: obcy

添加第三方认证

上级 290ef66d
package com.zzsn.knowbase.config.interceptor;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.zzsn.knowbase.service.KbAuthorizedUserService;
import com.zzsn.knowbase.util.SpringContextUtils;
import com.zzsn.knowbase.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: 拦截所有的请求,对请求进行第三方系统认证
* @Author: obcy
* @Date: 2024/1/5
*/
@Slf4j
public class KnowInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行调用(Controller方法调用之前)
// 返回true才会继续执行后续的Interceptor和Controller
// 返回false则取消当前请求
String token = request.getHeader("X-Access-Token");
KbAuthorizedUserService userService = SpringContextUtils.getBean(KbAuthorizedUserService.class);
Result<?> result = userService.doCheck(token);
/**第三方用户验证未通过,直接拦截请求并返回提示*/
if (!result.isSuccess()){
doRes(request,response);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要进行资源清理工作)
}
public void doRes(HttpServletRequest request,HttpServletResponse response) throws IOException {
response.setStatus(550);
response.setContentType("application/json;charset=UTF-8");
Map<String, Object> map = new HashMap<>();
map.put("timestamp", DateUtil.formatDateTime(new Date()));
map.put("status",500);
map.put("error","Internal Server Error");
map.put("message","第三方用户验证未通过,请检查令牌是否正确");
map.put("path",request.getRequestURI());
String res = JSON.toJSONString(map);
PrintWriter writer = response.getWriter();
writer.write(JSON.toJSONString(map));
writer.flush();
log.error("拦截请求:{}",res);
}
}
package com.zzsn.knowbase.config.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @Description:
* @Author: obcy
* @Date: 2024/4/5
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加自定义拦截器,拦截所有路径
registry.addInterceptor(new KnowInterceptor()).addPathPatterns("/**");
}
}
......@@ -23,4 +23,6 @@ public interface KbAuthorizedUserService extends IService<KbAuthorizedUser> {
Result<?> userPermission(String token);
Result<?> thirdpartyUsers(String token);
Result<?> doCheck(String token);
}
......@@ -170,7 +170,9 @@ public class KbAuthorizedUserServiceImpl extends ServiceImpl<KbAuthorizedUserMap
return Result.OK(list);
}
private Result<?> doCheck(String token) {
@Override
public Result<?> doCheck(String token) {
String body = HttpRequest.post(checkuserurl).header("X-Access-Token", token).execute().body();
Result bean = JSONUtil.toBean(body, Result.class);
return bean;
......
package com.zzsn.knowbase.util;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
/**
* @Description: spring容器取bean的工具类;
* @Author: obcy
* @Date: 2024/1/5
*/
@Component
@Slf4j
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringContextUtils.applicationContext == null) {
SpringContextUtils.applicationContext = applicationContext;
}
}
/**
* @apiNote 获取applicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* @apiNote 通过name获取 Bean.
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* @apiNote 通过class获取Bean.
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* @apiNote 通过name, 以及Clazz返回指定的Bean
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
/**
* 注册一个bean到spring容器中
* @param beanName bean的name
* @param clazz bean对应的class类,实际他会根据这个类来反射生成对象
* @param args 如果class类对应的有 有参的构造器
* @param <T> 返回这个bean的对象
* @return
*/
public static <T> T registerBean(String beanName, Class<T> clazz, Object... args) {
if(applicationContext.containsBean(beanName)) {
Object bean = applicationContext.getBean(beanName);
Class<?> aClass = bean.getClass();
/**
* 解释可以参考jdk Class类的原文翻译——想了解的自己去翻译
* 也就是判断当前的Class对象所表示的类,是不是参数中传递的Class对象所表示的类的父类,接口,
* 或者是相同的类型。是则返回true,否则返回false。
* 这里,bean.getClass(),只要在spring容器里的,都是基于spring给创建的代理类,也就是cglib;
* 那么肯定符合子类这条,反过来就不行了
*/
if (clazz.isAssignableFrom(bean.getClass())) {
return (T) bean;
} else {
throw new RuntimeException("BeanName 重复:"+beanName);
}
}
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
if (ObjectUtil.isNotEmpty(args)) {
for (Object arg : args) {
beanDefinitionBuilder.addConstructorArgValue(arg);
}
}
GenericBeanDefinition beanDefinition = (GenericBeanDefinition)beanDefinitionBuilder.getRawBeanDefinition();
beanDefinition.setBeanClass(clazz);
beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_NAME);
ConfigurableApplicationContext context = null;
if (applicationContext instanceof ConfigurableApplicationContext){
context = (ConfigurableApplicationContext)applicationContext;
}
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) context.getBeanFactory();
beanFactory.registerBeanDefinition(beanName, beanDefinition);
return applicationContext.getBean(beanName, clazz);
}
/**
* 根据beanName删除掉spring容器中的对象
* @param beanName
*/
public static void removeBean(String beanName) {
ConfigurableApplicationContext context = null;
if (applicationContext instanceof ConfigurableApplicationContext){
context = (ConfigurableApplicationContext)applicationContext;
}
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) context.getParentBeanFactory();
//Object bean = applicationContext.getBean(beanName);
try {
beanFactory.removeBeanDefinition(beanName);
}catch (Exception e){
log.error("删除beanName:{}失败!",beanName);
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论