public ResponseResult login(AccountLoginDto accountLoginDto) { //用户认证 UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(accountLoginDto.getUname(),accountLoginDto.getPwd()); Authentication authentication = authenticationManager.authenticate(authenticationToken); //如果认证没通过,给出相应提示 if (Objects.isNull(authentication)){ throw new RuntimeException("用户名或密码错误"); } //认证通过,使用accountid生成token LoginAccount loginAccount =(LoginAccount) authentication.getPrincipal(); String accountId = loginAccount.getAccount().getId().toString(); String jwt = JwtUtil.createJWT(accountId); //authentication存入redis redisCache.setCacheObject("login"+accountId,loginAccount); //把token响应给前端 HashMap<String, String> map = new HashMap<>(); map.put("taken",jwt); return new ResponseResult<>(200,"登录成功",map);
时间: 2024-04-18 11:28:38 浏览: 22
这段代码是一个登录接口的实现。首先,它接收一个AccountLoginDto对象作为参数,其中包含用户的用户名和密码。接下来,它使用这些凭据创建一个UsernamePasswordAuthenticationToken对象,并使用authenticationManager对其进行认证。
如果认证通过,它将从Authentication对象中获取用户的登录信息,并将其转换为LoginAccount对象。然后,它使用用户的账户ID生成一个JWT令牌,并将认证信息存储在Redis缓存中。
最后,它将JWT令牌作为响应返回给前端,以表示登录成功。响应结果包含状态码200、消息"登录成功"和一个包含JWT令牌的Map对象。
相关问题
Authentication authentication = new UsernamePasswordAuthenticationToken(username, "N/A", null);
根据提供的引用内容,`Authentication authentication = new UsernamePasswordAuthenticationToken(username, "N/A", null);`是创建一个`UsernamePasswordAuthenticationToken`对象,并将其赋值给`Authentication`类型的变量`authentication`。
`UsernamePasswordAuthenticationToken`是Spring Security中的一个实现了`Authentication`接口的类,用于表示基于用户名和密码的身份验证令牌。它接受三个参数:用户名、密码和权限列表。
这段代码的作用是创建一个身份验证令牌,其中密码被设置为"N/A",权限列表为null。这通常用于在某些情况下,例如在用户注册时,创建一个临时的身份验证令牌。
请注意,这段代码只是创建了一个身份验证令牌,并没有进行实际的用户认证。要进行用户认证,需要使用`AuthenticationManager`的`authenticate`方法。
public void configureClientInboundChannel(ChannelRegistration registration) { registration.interceptors(new ChannelInterceptor() { @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (StompCommand.CONNECT.equals(accessor.getCommand())) { String token = accessor.getFirstNativeHeader("Auth-Token");// if (!StringUtils.isEmpty(token)) { String authToken = token.substring(tokenHead.length()); String username = jwtTokenUtil.getUserNameFromToken(authToken); if (!StringUtils.isEmpty(username)) UserDetails userDetails = userDetailsService.loadUserByUsername(username); if (jwtTokenUtil.validateToken(authToken, userDetails)) { UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authenticationToken); accessor.setUser(authenticationToken); } } } } return message; } }); }是怎么运行的
这是一个 Spring Boot 中 WebSocket 的配置代码。在这个配置中,我们注册了一个 ChannelInterceptor,它的主要作用是在客户端连接到服务器之前,验证客户端的身份,并在连接成功后,将用户的认证信息保存在 StompHeaderAccessor 中,以便后续的处理。
具体来说,在客户端连接到服务器时,会发送一个 CONNECT 命令,该拦截器会从消息头中获取 "Auth-Token",并解析出其中的用户名和认证信息。然后,它会使用 Spring Security 的 UserDetailsService 加载该用户的 UserDetails,再使用 JWT TokenUtil 验证该用户的认证信息是否有效。如果验证通过,则创建一个 UsernamePasswordAuthenticationToken 对象,并使用 SecurityContextHolder 将其设置为当前的认证信息。
最后,将这个 authenticationToken 对象设置为 StompHeaderAccessor 的用户,并返回处理后的消息对象。这样,在后续的处理中,我们就可以从 StompHeaderAccessor 中获取到用户的认证信息了。