Pass parameter to controller

JVi*_*Vic 3 spring controller jwt spring-boot

I have some app with JWT authentication. And currently, I have such controller:

@RestController
@RequestMapping("users")
public class UserController {
    @PostMapping(value = "{userId}/rate/inc")
    public Double incRate(@PathVariable Long userId) {
        return service.incUserRate(userId);
    }
}
Run Code Online (Sandbox Code Playgroud)

But, I want to get user by the token in the filter and pass it as a method's param. For example:

@PostMapping(value = "/rate/inc")
public Double incRate(User user) {
    returnservice.incUserRate(user);
}
Run Code Online (Sandbox Code Playgroud)

Is this possible?

Bog*_*ros 5

实现参数解析器并将所需的一切注入到控制器中。

默认情况下,Spring允许您注入默认情况下包含用户电子邮件的Principal对象(这是Spring Security中的默认实现)。但是您可以通过实施来实现对企业登录用户帐户的注入Interface HandlerMethodArgumentResolver<User>

我建议您创建一个注释,例如使用该注释@AuthorizedUser在make中标记您的User参数。并根据控制器方法中的此注释存在,通过注入用户HandlerMethodArgumentResolver

@Component
public class UserArgumentHandlerResovler implements HandlerMethodArgumentResolver {

    @Autowired
    private UserRepository userRepository;

    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.isAnnotationPresent(AuthorizedUser.class);
    }

    public Object   resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { 
         Authentication auth = SecurityContextHolder.getContext().getAuthentication();
         String email = (String) auth.getPrincipal(); // <- it is a pseudocode, check your Authentication implementation to get email for example.
         return userRepository.findByEmail(email);
    }
}
Run Code Online (Sandbox Code Playgroud)