import org.apache.commons.lang3.ObjectUtils; //导入方法依赖的package包/类
@Override
public Message< ? > preSend ( Message< ? > message , MessageChannel channel ) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor( message , StompHeaderAccessor.class );
if ( ObjectUtils.notEqual( StompCommand.CONNECT , accessor.getCommand() ) ) {
return message;
}
final String authToken = accessor.getFirstNativeHeader( tokenHeader );
final String username = jwtTokenUtil.getUsernameFromToken( authToken );
LogUtils.getLogger().debug( "authToken : {},username : {}" , authToken , username );
if ( StringUtils.isEmpty( username ) ) {
throw new AuthenticationCredentialsNotFoundException( "未授权" );
}
if ( SecurityContextHolder.getContext().getAuthentication() == null ) {
// 对于简单的验证,只需检查令牌的完整性即可。 您不必强制调用数据库。 由你自己决定
// 是否查询数据看情况,目前是查询数据库
UserDetails userDetails = this.userDetailsService.loadUserByUsername( username );
if ( jwtTokenUtil.validateToken( authToken , userDetails ) ) {
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken( userDetails , null , userDetails.getAuthorities() );
// authentication.setDetails( new WebAuthenticationDetailsSource().buildDetails( request ) );
LogUtils.getLogger().debug( "authToken : {},username : {}" , authToken , username );
LogUtils.getLogger().debug( "该 " + username + "用户已认证WebSocket, 设置安全上下文" );
SecurityContextHolder.getContext().setAuthentication( authentication );
accessor.setUser( authentication );
}
}
if ( Objects.isNull( accessor.getUser() ) ) {
throw new AuthenticationCredentialsNotFoundException( "未授权" );
}
return message;
}