Grammarly
Grammarly Blog: Comma Between Direct Quote and Attributive Tag
This page explains the comma placement needed between a direct quote and its speaker dependent upon the location of the attributive tag. It includes examples of various tag locations.