软工周报23-10-10

发布时间 2023-10-10 20:02:03作者: 天启A

这期主要学习了一些网页安全问题:路由守卫,jwt的使用。经过这一周期的学习,我可以初步做出一个信息较安全,有基础防御措施的网页

解决问题:首先

学了一些请求,与跨域相关的问题,主要研究了option请求的作用,以及如何阻止他对于token令牌获取的干扰这一问题。

首先option请求用于跨域资源共享,当发出跨域Ajax请求时,浏览器会自动发送Option请求,以检查是否允许实际请求。但是这一请求中不能附带一些额外的参数。比如token,这会使系统在进行jwt检测的时候直接报错“token已经失效”,因为没有接收到一个正常的token。当引入下面代码时,可跨过option请求,直接对getpost这类请求进行审核

@Configuration
public class corsConfig {
    @Bean
    public CorsFilter corsFilter(){
        UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration=new CorsConfiguration();
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsFilter(source);
    }
}

 

下面这段函数是添加一个阻断器,在使其每次发生请求变化时都要进行jwt检测。当然,并不是所有指令都需要这种检测,后续加上一些可以不进行检测的url

@Override
    public void addInterceptors(InterceptorRegistry reg){
        reg.addInterceptor(jwtInterceptor).addPathPatterns("/anqi/**")
                        .excludePathPatterns("/anqi/admin/login")
                        .excludePathPatterns("/anqi/admin/register")
                        .excludePathPatterns("/anqi/files/**")
                        .excludePathPatterns("/anqi/files/**");


    }

 下面这段函数是一段是jwt过程中token的验证,这次我将token放在header中,以便于提取使用

 public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){
//        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
//            System.out.println("OPTIONS请求,放行");
//            return true;
//        }
        //1.获取token
        System.out.println(request.getHeader("token"));

        String token=request.getHeader("token");
        if(StrUtil.isBlank(token)){
            //第一次没拿到 去参数里面拿 比如 /anqi/admin?token=xxx
            System.out.println("token没拿到");
            token=request.getParameter("token");
        }
        //2.开始认证
        if(StrUtil.isBlank(token)){
            throw new CustomException("token已经消失,请重新登录");
        }
        //获取token中的id
        String adminID;
        Admin admin;
        try{
            adminID= JWT.decode(token).getAudience().get(0);
            admin=adminMapper.findByID(Integer.parseInt(adminID));
        }catch (Exception e){
            String msg="token认证失败";
            log.error(msg+",token="+token,e);
            throw new CustomException(msg);
        }
        if(admin==null){
            throw new CustomException("用户不存在请重新登录");
        }
        try{
            //用户密码加签验证token
            JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256(admin.getPassword())).build();
            jwtVerifier.verify(token);
        }catch (JWTVerificationException e){
            throw new CustomException("token验证失败请重新登录");
        }
        log.info("token验证成功");
        return true;
    }

 关于如何设置token:为了节省数据库的查询空间,在进行登录时会生成对应的token与用户信息一起存储在localstorage中,一旦信息遭到破坏,上面的阻断器就会生效阻止用户继续访问页面