从 spring 启动为 angular 应用程序生成 jwt 令牌
generate jwt token from spring boot for an angular application
我的问题是关于基于 jwt 令牌的身份验证,在后端使用 spring 引导,在前端使用 angular,因此我在 spring 安全配置中开发了两个过滤器,一个用于颁发令牌,另一个用于验证它们,在颁发令牌的过滤器内部:对“/login”端点的请求将包含用户详细信息,例如密码和用户名,因此过滤器可以对用户进行身份验证并在 return 中颁发令牌,这就是我的问题,在我们到达必须创建特定端点的控制器之前,我看不到任何其他方式来进行身份验证操作。
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException {
try {
~~// 1. Get credentials from request
~~UserCredentials creds = new ~~ObjectMapper().readValue(request.getInputStream(), ~~UserCredentials.class);
// 2. Create auth object (contains credentials) which will be used by auth manager
~~UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(creds.getUsername(),creds.getPassword(), Collections.emptyList());
// 3. Authentication manager authenticate the user, and use ~~UserDetialsServiceImpl::loadUserByUsername() method to load the user.
return authManager.authenticate(authToken);
~~} catch (IOException e) {
~~~~~~throw new RuntimeException(e);
}
}
我的朋友们,我希望你能告诉我我已经做的事情是否好,以及如何在控制器内或直接在过滤器内执行该操作的最佳方式?
谢谢(请原谅我的英文)
预期结果:
@PostMapping("/login")
public void method(@RequestBody MyUser myUser){
// perform authentication and issue token for my front app
}
最好按照下面的来做。
1) 令牌问题 - 它应该在过滤级别之后完成,我的意思是您应该在为该用户颁发令牌之前验证您的 HTTP 请求和数据(密码和用户 ID),在过滤级别进行此验证是反对正确的设计模式。
2) 验证 - 您可以在过滤器级别本身进行验证。它还可以帮助您避免在每个控制器方法或额外注释中单独编写验证逻辑。
我的问题是关于基于 jwt 令牌的身份验证,在后端使用 spring 引导,在前端使用 angular,因此我在 spring 安全配置中开发了两个过滤器,一个用于颁发令牌,另一个用于验证它们,在颁发令牌的过滤器内部:对“/login”端点的请求将包含用户详细信息,例如密码和用户名,因此过滤器可以对用户进行身份验证并在 return 中颁发令牌,这就是我的问题,在我们到达必须创建特定端点的控制器之前,我看不到任何其他方式来进行身份验证操作。
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException {
try {
~~// 1. Get credentials from request
~~UserCredentials creds = new ~~ObjectMapper().readValue(request.getInputStream(), ~~UserCredentials.class);
// 2. Create auth object (contains credentials) which will be used by auth manager
~~UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(creds.getUsername(),creds.getPassword(), Collections.emptyList());
// 3. Authentication manager authenticate the user, and use ~~UserDetialsServiceImpl::loadUserByUsername() method to load the user.
return authManager.authenticate(authToken);
~~} catch (IOException e) {
~~~~~~throw new RuntimeException(e);
}
}
我的朋友们,我希望你能告诉我我已经做的事情是否好,以及如何在控制器内或直接在过滤器内执行该操作的最佳方式? 谢谢(请原谅我的英文)
预期结果:
@PostMapping("/login")
public void method(@RequestBody MyUser myUser){
// perform authentication and issue token for my front app
}
最好按照下面的来做。
1) 令牌问题 - 它应该在过滤级别之后完成,我的意思是您应该在为该用户颁发令牌之前验证您的 HTTP 请求和数据(密码和用户 ID),在过滤级别进行此验证是反对正确的设计模式。
2) 验证 - 您可以在过滤器级别本身进行验证。它还可以帮助您避免在每个控制器方法或额外注释中单独编写验证逻辑。