夜、空 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 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?
  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题