Spring boot 为什么我的代码不给注册用户的邮递员结果中的jwtToken

Spring boot 为什么我的代码不给注册用户的邮递员结果中的jwtToken,spring-boot,spring-security,jwt,Spring Boot,Spring Security,Jwt,我正在使用spring boot和jwt构建简单的curd应用程序。当我使用postman ContentType/json注册用户时,当我提交所有详细信息时,我得到响应所有详细信息用户详细信息,代码为201,但 token=null,我得到。 在这里我添加了jwt过滤器和用户控制器文件,请检查并帮助我在哪里丢失了代码 这是我的密码 JwtTokenProvider 用户控制器 @RestController 公共类用户控制器{ @自动连线 私有JwtTokenProvider tokenPro

我正在使用spring boot和jwt构建简单的curd应用程序。当我使用postman ContentType/json注册用户时,当我提交所有详细信息时,我得到响应所有详细信息用户详细信息,代码为201,但 token=null,我得到。 在这里我添加了jwt过滤器和用户控制器文件,请检查并帮助我在哪里丢失了代码

这是我的密码

JwtTokenProvider 用户控制器
@RestController
公共类用户控制器{
@自动连线
私有JwtTokenProvider tokenProvider;
@自动连线
私人用户服务;
@自动连线
私人产品服务;
@自动连线
私人交易服务交易服务;
@后期映射(“/api/用户/注册”)
公共响应性寄存器(@RequestBody User){
if(userService.findByUsername(user.getUsername())!=null){
返回新的ResponseEntity(HttpStatus.CONFLICT);
}
//默认角色。
user.setRole(Role.user);
返回新的响应属性(userService.saveUser(user),HttpStatus.CREATED);
}
@GetMapping(“/api/user/login”)
公共响应getUser(主要负责人){
//principal=httpServletRequest.getUserPrincipal。
if(principal==null){
//注销也将在此处使用,因此我们应该返回ok http状态。
返回响应性。ok(委托人);
}
UsernamePasswordAuthenticationToken authenticationToken=
(UsernamePasswordAuthenticationToken)主体;
User User=userService.findByUsername(authenticationToken.getName());
user.setToken(tokenProvider.generateToken(authenticationToken));
返回新的响应属性(用户,HttpStatus.OK);
}

请帮帮我。

有几件事需要注意

  • 调用用户注册后,您试图在响应正文中查看JWT令牌。但令牌生成方法generateToken()是在用户登录方法getUser()中调用的,而不是在用户注册方法register()中调用的。因此,注册时不会生成令牌。请尝试用户登录,将生成令牌

  • 您正在响应正文中传递JWT令牌。理想情况下,您应该在响应标头“Authorization”中传递它。您可以使用response.addHeader(“Authorization”,token)

  • 第一:获取输出 当您向控制器(“/api/user/registration”)发送POST请求时,您永远不会调用
    JwtTokenProvider
    类。因此,永远不会生成令牌

    请尝试以下操作:

    @PostMapping("/api/user/registration")
        public ResponseEntity<String> register(@RequestBody User user){
            if(userService.findByUsername(user.getUsername())!=null){
                return new ResponseEntity<>(HttpStatus.CONFLICT);
            }
            //default role.
            user.setRole(Role.USER);
            userService.saveUser(user);
    // I am not sure if this is really correct, but it should do it... Otherwise, change this method.
            UsernamePasswordAuthenticationToken  auth = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getRoles());
            String token = tokenProvider.generateToken(user);
            return ResponseEntity.ok(token);
        }
    
    @PostMapping(“/api/user/registration”)
    公共响应性寄存器(@RequestBody User){
    if(userService.findByUsername(user.getUsername())!=null){
    返回新的ResponseEntity(HttpStatus.CONFLICT);
    }
    //默认角色。
    user.setRole(Role.user);
    userService.saveUser(用户);
    //我不确定这是否真的正确,但它应该这样做…否则,改变这个方法。
    UsernamePasswordAuthenticationToken auth=新的UsernamePasswordAuthenticationToken(user.getUsername(),user.getRoles());
    String token=tokenProvider.generateToken(用户);
    返回ResponseEntity.ok(令牌);
    }
    
    你应该有一个输出

    第二:使用标题
    如果您有第一个带有令牌的输出,那么您可以尝试将令牌添加到标头中,或任何您想要的位置。请尝试一下,让我知道。

    什么类调用您的
    JwtTokenProvider
    ?您有控制器吗?过滤器?我添加了控制器和jwtfilte文件请立即检查@RUARO Thibault2
    public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
    
        private JwtTokenProvider jwtTokenProvider;
    
        public JWTAuthorizationFilter(AuthenticationManager authenticationManager,
                                      JwtTokenProvider tokenProvider) {
            super(authenticationManager);
            jwtTokenProvider = tokenProvider;
        }
    
        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            Authentication authentication = jwtTokenProvider.getAuthentication(request);
    
            if(authentication !=null && jwtTokenProvider.validateToken(request)){
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
            chain.doFilter(request, response);
        }
    }
    
    
    @RestController
    public class UserController {
    
        @Autowired
        private JwtTokenProvider tokenProvider;
    
        @Autowired
        private UserService userService;
    
        @Autowired
        private ProductService productService;
    
        @Autowired
        private TransactionService transactionService;
    
        @PostMapping("/api/user/registration")
        public ResponseEntity<?> register(@RequestBody User user){
            if(userService.findByUsername(user.getUsername())!=null){
                return new ResponseEntity<>(HttpStatus.CONFLICT);
            }
            //default role.
            user.setRole(Role.USER);
            return new ResponseEntity<>(userService.saveUser(user), HttpStatus.CREATED);
        }
    
        @GetMapping("/api/user/login")
        public ResponseEntity<?> getUser(Principal principal){
            //principal = httpServletRequest.getUserPrincipal.
            if(principal == null){
                //logout will also use here so we should return ok http status.
                return ResponseEntity.ok(principal);
            }
            UsernamePasswordAuthenticationToken authenticationToken =
                    (UsernamePasswordAuthenticationToken) principal;
            User user = userService.findByUsername(authenticationToken.getName());
            user.setToken(tokenProvider.generateToken(authenticationToken));
    
            return new ResponseEntity<>(user, HttpStatus.OK);
        }
    
    
    @PostMapping("/api/user/registration")
        public ResponseEntity<String> register(@RequestBody User user){
            if(userService.findByUsername(user.getUsername())!=null){
                return new ResponseEntity<>(HttpStatus.CONFLICT);
            }
            //default role.
            user.setRole(Role.USER);
            userService.saveUser(user);
    // I am not sure if this is really correct, but it should do it... Otherwise, change this method.
            UsernamePasswordAuthenticationToken  auth = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getRoles());
            String token = tokenProvider.generateToken(user);
            return ResponseEntity.ok(token);
        }