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?
实现参数解析器并将所需的一切注入到控制器中。
默认情况下,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)
| 归档时间: |
|
| 查看次数: |
737 次 |
| 最近记录: |