我有一些使用JWT身份验证的应用。目前,我有这样的控制器:
savedInstanceState
但是,我想通过过滤器中的令牌获取用户并将其作为方法的参数传递。例如:
@RestController
@RequestMapping("users")
public class UserController {
@PostMapping(value = "{userId}/rate/inc")
public Double incRate(@PathVariable Long userId) {
return service.incUserRate(userId);
}
}
这可能吗?
答案 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)