我在使用Spring安全框架的CRUD API项目中工作,我想使用JWT令牌实现授权验证。
假设我有3个端点:
1.身份验证控制器,用户可以在其中注册或登录(如果他有帐户)
1.返回字符串以确保授权有效的伪get
1.我可以在其中更新有关当前用户的信息
我的用户会这样
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String favoriteAnimal;
}
在我的第三个端点,我想更新我的用户最喜欢的动物。
@PostMapping("/update")
public ResponseEntity<String> updatePet(@RequestBody UserDTO user) {
return new ResponseEntity<>(UserSevices.updateUserInfo, HttpStatus.OK);
}
确保调用此端点的用户是具有JWT标记的正确用户的正确方法是什么?
我的AuthorizationFilter扩展了OncePerRequestFilter并实现了doFilterInternal()
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String token = getJWTFromRequest(request);
if(StringUtils.hasText(token) && tokenGenerator.validateToken(token)) {
String username = tokenGenerator.getUsernameFromJWT(token);
UserDetails userDetails = customUserDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null,
userDetails.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
filterChain.doFilter(request, response);
}
我们同意,当我调用端点时,用户请求将通过此过滤器?此过滤器正确吗?现在在我的服务中,如果我想通过id获取用户,我如何获得id?我必须使用ID密钥创建令牌?令牌在用户首次登录时生成并提供给用户。
我很抱歉,如果这是一个有点混乱,但我一直无法找到信息在线。
我的AuthorizationFilter扩展了OncePerRequestFilter并实现了doFilterInternal()
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String token = getJWTFromRequest(request);
if(StringUtils.hasText(token) && tokenGenerator.validateToken(token)) {
String username = tokenGenerator.getUsernameFromJWT(token);
UserDetails userDetails = customUserDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null,
userDetails.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
filterChain.doFilter(request, response);
}
我们同意,当我调用端点时,用户请求将通过此过滤器?此过滤器正确吗?现在在我的服务中,如果我想通过id获取用户,我如何获得id?我必须使用ID密钥创建令牌?令牌在用户首次登录时生成并提供给用户。
我很抱歉,如果这是一个有点混乱,但我一直无法找到信息在线。
我将jjwt库用于token
1条答案
按热度按时间xiozqbni1#
有一个很好的教程关于这个主题:
Spring Boot JWT - How to Secure your REST APIs with Spring Security and Json Web Tokens
我还建议您在下面的link上查看有关
WebSercurityConfigurerAdapter
的更新。