将参数传递给控制器

时间:2018-02-03 20:27:26

标签: spring spring-boot controller jwt

我有一些使用JWT身份验证的应用。目前,我有这样的控制器:

savedInstanceState

但是,我想通过过滤器中的令牌获取用户并将其作为方法的参数传递。例如:

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

这可能吗?

2 个答案:

答案 0 :(得分:4)

实施argument resolver并向控制器注入您需要的一切。

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

我建议您使用此注释在make @AuthorizedUser param中创建类似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);
    }
}

答案 1 :(得分:2)

如果使用Spring Security,则可以解析当前用户,然后将其提供给控制器方法。但是 - 如果我没弄错的话 - 你必须将其声明为Principal

@PostMapping(value = "/rate/inc")
public Double incRate(Principal principal) {
    returnservice.incUserRate((User)principal);
}

可以在Baeldung找到更广泛的示例。