【问题标题】:Pass parameter to controller将参数传递给控制器
【发布时间】:2018-07-14 01:49:21
【问题描述】:

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

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

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

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

这可能吗?

【问题讨论】:

    标签: spring spring-boot controller jwt


    【解决方案1】:

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

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

    我建议你创建一个像 @AuthorizedUser 这样的注解,用这个注解标记你的 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);
        }
    }
    

    【讨论】:

    • AuthorizedUser 类有什么?可以发一下吗?
    • AuthorizedUser 只是一个标记注释,您可以省略它并使用不同的方法来识别您的特定用户。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多