夜、空 2023-04-14 09:16 采纳率: 100%
浏览 26
已结题

springsecurity只有edge浏览器可以访问接口

我在springcloud项目中的消费端配置了springsecurity,可以正常使用。但是我没有配置任何权限的信息,数据库也没有权限字段。我将登录注册的接口放行,我的edge浏览器可以正常访问登录,但是只有edge可以正常登录。我用谷歌浏览器登录会报
error: "Forbidden"
message: "Access Denied"
403错误
postman测试接口就是如此
我的安全配置:

 protected void configure(HttpSecurity http) throws Exception {
       http
               //关闭csrf
               .csrf().disable()
               .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
               .and()
               .authorizeRequests()
               //放行接口
               //放行登录,注册接口.注:
               // 使用 permitAll() 方法所有人都能访问,包括带上 token 访问
               // 使用 anonymous() 匿名访问,但是带上 token 访问后会报错
               .antMatchers("/loginConsumer/loginByPhone").permitAll()
               .antMatchers("/loginConsumer/create").permitAll()
               .antMatchers("/image/**").permitAll()
               //除了上面放行接口其他接口均需验证
               .anyRequest().authenticated();
               //限制只能同一设备在线
//               .and().sessionManagement().maximumSessions(1);

       //配置过滤器
        http
               .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
//       配置认证失败,授权失败异常处理器
//        http
//                .exceptionHandling()
//                //认证处理器
//                .authenticationEntryPoint(authenticationEntryPoint)
//                //权限处理器
//                .accessDeniedHandler(accessDeniedHandler);
        //配置跨域
        http.cors();
    }

过滤器:


protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        //获取token,请求头中的token
        String token = request.getHeader("token");

        if (StringUtils.isEmpty(token)){
            //无token代表访问不用认证的接口,直接放行
            filterChain.doFilter(request,response);
            //return防止重复过滤
            return;
//            System.out.println(token);
        }
        //解析token,工具已抛异常
        String bossId = jwtTokenUtil.getTokenInfo(token);
        //判断token是否过期
//        boolean canRefreshToken = jwtTokenUtil.canRefresh(token);
//        if (canRefreshToken){
            //token过期,刷新token,存入请求头
//            String token1 = jwtTokenUtil.generateToken(bossId);
//            response.setHeader("token",token1);
            //过期提示重新登录
//        }
        //从redis中获取对象数据,上面token验证已过,数据库存在用户,直接拿取不做判断
            //直接从redis中获取对象
        LoginInfo loginInfo = (LoginInfo) redisUtil.get(bossId);
        /*
        添加权限操作
        code...
         */
        //存入SecurityContextHolder,第一个参数存放用户信息,第二个为认证信息,第三个为权限
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken=
                new UsernamePasswordAuthenticationToken(loginInfo,null,null);
        SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);

        //最后放行
        filterChain.doFilter(request,response);
    }

登录接口:

public CommonResult loginByName(@RequestBody LoginInfo loginInfo) {
//        LoginInfo result = logIOFeignService.getloginByPhoneOrId(loginInfo);
        //封装authenticate对象
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken=
                new UsernamePasswordAuthenticationToken(loginInfo.getBossName(),loginInfo.getBossPassword());
        //将电话号密码传给Authentication对象,该对象去找登录接口LoginDetailServiceImpl进行校验,成功后会将结果返回
        Authentication authenticate =
                authenticationManager.authenticate(usernamePasswordAuthenticationToken);
        LoginUserDetail loginInfo1 = (LoginUserDetail) authenticate.getPrincipal();
        //获取bossId
        String bossId=loginInfo1.getLoginInfo().getBossId();
        //根据bossid生成token
        String token = jwtTokenUtil.generateToken(bossId);
        HashMap<String,Object> tokenMap=new HashMap<>();
        tokenMap.put("token",token);
        //将对象存入redis
        redisUtil.set(bossId,loginInfo1.getLoginInfo());
        return CommonResult.ok(tokenMap,200,"成功");
    }

edge访问成功:

img

谷歌访问失败:

img

postman访问失败:

img

  • 写回答

3条回答 默认 最新

  • 三千烦恼丝xzh 2023-04-14 13:05
    关注

    放行的是loginByPhone访问的是loginByName呢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 已采纳回答 4月14日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵