Java Spring boot返回403,尽管我有管理权限

Java Spring boot返回403,尽管我有管理权限,java,spring,redirect,spring-security,jwt,Java,Spring,Redirect,Spring Security,Jwt,我在将/admin端点添加到antMatchers(“/admin”)时遇到了这个问题。hasAuthority(“admin”) 它不会向/admin发出GET请求并返回200而是返回403 注意:我使用JWT作为额外的身份验证层 这是我的安全配置 httpSecurity.csrf().disable() .authorizeRequests().antMatchers(“/”、“/health”、“/authority”、“/dashboard”、“/users/login”、“/logo

我在将
/admin
端点添加到
antMatchers(“/admin”)时遇到了这个问题。hasAuthority(“admin”)
它不会向
/admin
发出GET请求并返回
200
而是返回
403

注意:我使用JWT作为额外的身份验证层

这是我的安全配置

httpSecurity.csrf().disable()
.authorizeRequests().antMatchers(“/”、“/health”、“/authority”、“/dashboard”、“/users/login”、“/logoutUser”、“/manageEvents”、“/ManageEds”、“/manageReports”,
“/charts”、“/error”、“/profile”、“/authenticate/**”、“/login”、“/403”、“/userProfile”、“/deletead”、“/users/add”)。permitAll()
.antMatchers(“/admin”).hasAuthority(“admin”)
.antMatchers(“/css/**”,“/img/**”,“/js/**”,“/images/**”,“/error_css/**”,“/scss/**”,“/vendor/**”)。permitAll()
.anyRequest().authenticated()和()。
exceptionHandling().accessDeniedPage(“/403”)。和()
.会议管理()
.sessionCreationPolicy(sessionCreationPolicy.STATELESS);
httpSecurity.addFilterBefore(jwtRequestFilter,UsernamePasswordAuthenticationFilter.class);
通过将其移动到
permit.All()
它将起作用,但这里的情况并非如此

这就是我在
@Controller

@GetMapping(“/authority”)
公共字符串getAuth(HttpServletResponse){
如果(jwt==null){
返回“重定向:/login”;
}
if(jwtTokenUtil.isTokenExpired(jwt)){
返回“重定向:/login?令牌=过期”;
}
addHeader(“Auth”、“Bearer”+jwt);
System.out.println(loggedinUser.getRoles());
if(loggedinUser!=null){
if(loggedinUser.getRoles().equalsIgnoreCase(“TileFinitis”)){
返回“重定向:/dashboard”;//将重定向
}else if(loggedinUser.getRoles().equalsIgnoreCase(“ADMIN”)){
System.out.println(“管理”);
返回“重定向:/admin”;//不会重定向
}else if(loggedinUser.getRoles().equalsIgnoreCase(“来宾”)){
返回“重定向:/403”;//将重定向
}否则{
返回“重定向:/dashboard”;//将重定向
}
}否则{
返回“重定向:/login”;
}
}
这是我的
/admin
@Controller
中,它从未被调用过

@GetMapping(“/admin”)
公共字符串getAdmin(HttpServletResponse){
如果(jwt==null){
返回“重定向:/login”;
}
if(jwtTokenUtil.isTokenExpired(jwt)){
返回“重定向:/login?令牌=过期”;
}
addHeader(“Auth”、“Bearer”+jwt);
System.out.println(“jwt”+jwt);
返回“admin”;
}
奇怪的是,有了邮差我就被重定向了

我错过了什么


编辑:第一个调用是在
/authenticate/web
上,我告诉spring我已通过身份验证

authenticationManager
.authenticate(新用户名密码AuthenticationToken(auth.getUsername(),auth.getPassword());

编辑2:

为了让事情更清楚:

网站访问,流量:

  • 发布
    /authenticate/web
  • 使用
    .js
    重定向到
    /authority
    (获取)
  • 不会重定向到
    /admin
    (GET)->403
  • 从邮递员处访问,流程:

  • 发布
    /authenticate/web
  • 获取
    JWT
    并将其包含在标题中,然后访问
    /authority
  • 我看到了管理模板。->二百
  • 这真的很奇怪,我每次都在web流中添加
    jwt
    response.addHeader


    更新:

    • 以下是来自邮递员的响应标题:

    加上
    JWT

    • 来自web的响应头

    虽然现在我注意到我从网上得到了302,而不是200

    正如您所看到的,
    admin
    页面是403


    更新2:

    我已经设法解决了一些问题, 首先

    • 通过在我的security上设置一个
      httpSecurity.addFilterBefore
      配置意味着spring将查找
      JWT
      ,并在指定过滤器类的位置之前添加一个过滤器

    • 权限已正确分配给用户,因此没有问题 那里

    • 我将
      hasAuthority()
      更改为
      hasRole()

    如果您获得当前用户
    ,您可以自动访问其权限,如下所示

    Authentication auth=SecurityContextHolder.getContext().getAuthentication();
    System.out.println(“主体:+auth.getPrincipal());
    System.out.println(“Authorities:+auth.getAuthorities());
    
    因为
    身份验证
    jwt过滤器覆盖
    意味着只有在请求标头
    包含有效的
    jwt

    这就是为什么它是从
    postman
    而不是从
    web
    工作的


    另一个问题是,在我的控制器中,我试图将
    jwt
    添加到
    response
    头上,该头只有在控制器完成其工作时才会添加到它,我无法进入下一行用户主体,因为它的请求头中没有
    jwt

    此屏幕截图表示一个web呼叫和来自邮递员的呼叫,两者都访问
    /authority
    端点

    • 从邮递员那里,你可以看到
      ADMIN
      是一个权威
    • 但是从网络上我有一个匿名的
      角色
    所以我有两个选择来解决这个问题:

  • 将其添加到请求头中
  • 使用
    JWT
    保护
    REST
    端点,并对web部件使用默认的spring安全性(
    hasRole()
    etc)
  • 而不是
    “/admin”
    
    .antMatchers("/admin").hasAuthority("ADMIN")