Spring Security 使用Spring安全性和JWT令牌创建安全CRUD API的正确方法

yruzcnhs  于 2023-02-19  发布在  Spring
关注(0)|答案(1)|浏览(134)

我在使用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

xiozqbni

xiozqbni1#

有一个很好的教程关于这个主题:
Spring Boot JWT - How to Secure your REST APIs with Spring Security and Json Web Tokens
我还建议您在下面的link上查看有关WebSercurityConfigurerAdapter的更新。

相关问题