SecurityContextHolder.getContext().setAuthentication(authenticationToken);
时间: 2024-04-17 13:20:10 浏览: 13
SecurityContextHolder.getContext().setAuthentication(authenticationToken)是Spring Security框架中用于设置当前用户认证信息的方法。
在Spring Security中,认证信息被封装在Authentication对象中,该对象包含了用户的身份信息、权限信息等。而SecurityContextHolder是一个用于存储和获取当前用户认证信息的上下文对象。
通过调用SecurityContextHolder.getContext()方法可以获取当前线程的SecurityContext对象,而SecurityContext对象中又包含了当前用户的认证信息。通过调用setAuthentication(authenticationToken)方法可以将传入的Authentication对象设置为当前用户的认证信息。
这个方法通常在用户登录成功后被调用,用于将认证信息存储在SecurityContext中,以便后续的权限验证和访问控制。
相关问题
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 中获取到用户的认证信息了。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String token = httpServletRequest.getHeader("token"); try { if (StrUtil.isNotBlank(token)) { // 获取 token payload 信息 PayloadDataDTO payloadDataDTO = RsaTokenUtil.verifyAccessToken(token, RsaTokenUtil.generatePublicKey(KeyFactory.getInstance("RSA"))); // 根据用户名查询用户 UserDO userDO = userMapper.getByUserName(payloadDataDTO.getUserName()); // 单点登录判断 if(token.equals(userDO.getAccessToken())){ //security自带的框架,通过才能进入 UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(payloadDataDTO, null, null); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); SecurityContextHolder.getContext().setAuthentication(authentication); //把通过的东西放到自定义的实体里 servletRequest.setAttribute("userInfo", payloadDataDTO); } }
这段代码是一个 Servlet 过滤器的实现,用于验证用户的身份信息。具体实现步骤如下:
1. 从 ServletRequest 中获取 HttpServletRequest 对象,并从中获取请求头中的 token 值。
2. 使用 RsaTokenUtil 工具类中的 verifyAccessToken 方法对 token 进行验证和解析,得到 token 中包含的 payload 数据。
3. 使用 payload 中的用户名查询数据库,获取该用户的信息。
4. 判断用户的 token 是否与数据库中存储的相同,如果相同则说明该用户已经通过了单点登录验证。
5. 如果通过了验证,则使用 Spring Security 的 UsernamePasswordAuthenticationToken 对象将通过验证的用户信息放入 SecurityContextHolder 中,以便后续的操作可以直接从中获取用户信息。
6. 最后,将用户信息放入 ServletRequest 的 attribute 中,以便后续的操作可以直接从中获取用户信息。
需要注意的是,这段代码中使用了自定义的 PayloadDataDTO 类和 RsaTokenUtil 工具类,这些代码需要根据具体的项目进行实现。同时,该过滤器的实现需要在 Spring Security 的配置文件中进行注册。