我在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访问成功:
谷歌访问失败:
postman访问失败: