假设我要处理一个api端点/login
,该端点将获取 username&password 正文并在标头中返回JWT令牌。
将UsernamePasswordAuthenticationFilter
与
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
try {
LoginDto loginDto = new ObjectMapper().readValue(request.getInputStream(), LoginDto.class);
return getAuthenticationManager().authenticate(
new UsernamePasswordAuthenticationToken(
loginDto.getUsername(),
loginDto.getPassword(),
Collections.emptyList()
)
);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
是否提供了自己的@PostMapping("/login")
,而我却称自己为UserService
?
在单个端点上调用过滤器的原因/优势是什么?
答案 0 :(得分:1)
UsernamePasswordAuthenticationFilter
的主要优点是与自定义登录请求相比,与Spring的集成更好。使用它,框架为您提供了不错的方法:
管理以下事件:成功登录后,登录失败后和成功注销后。
该过滤器的结果是一个Spring Authentication
对象,因此,您可以根据需要在“其余登录请求”中使用它。
有关如何使用它的一些示例(在这两个示例中,您都将看到应如何配置UserService
):
UsernamePasswordAuthenticationFilter
UsernamePasswordAuthenticationFilter + JWT
但是,管理自己的登录端点也是一种广泛使用的选项。如果您确实不需要/使用上述优点,则可以创建自己的端点来管理该请求。