This was so much simpler than I thought it would’ve been. We can just use the constraints you mentioned in the edit.
The rotation should be the rotation of the player when they’re looking at the target object. We’re just locking the right vector so the player can’t move right or left (relative to how we’re currently facing).
Just set plane constraint normal back to 0,0,0 when you don’t want to lock any axes.