User has been denied select to table, but has access to table via synonym
This is because of the &quot;ownership chaining&quot; feature in SQL Server. It means that if one object (in your case a synonym) is calling another object (in your case a table), then it checks if the owner of the objects is the same. If the owner of both objects is the same then the access on the called objects (so your table) is not checked.
This feature is why for example users can have access to a view without having access to the underlying tables.
Normally this ownership chaining is not enabled cross-database by default. So check if it is in your case. It can be granted on database level:
SELECT is_db_chaining_on, name FROM sys.databases;

Or it can be granted on server level for all databases:
EXECUTE sp_configure 'show advanced', 1;  
RECONFIGURE;  
EXECUTE sp_configure 'cross db ownership chaining';