Стратегией можно.
По добавлению - все понятно. Когда модуль подключен, доступ к его контоллерам есть, когда нету - нету и доступа.
По поводу пользователей и связей.
Самый простой вариант
if (isset(Yii::app()->modules['moduleName'])) {...}
Но достаточно много мест будет таких, второй способ можно создать базовый класс стратегии, который будет на входе создавать один объект со всей необходимой логикой, либо файбрику объектов - так будет проще логику раскидать, во всех действиях использовать именно стратегию/фабрику, внутри которой уже будет подсовываться нужный класс по функционалу, если модуль доступен, один, если нет - другой.
В общем организовать нужно логику так, чтобы код не дублировался и оба случая не знали друг о друге.
Так же вполне подойдут (даже лучше, чем выше преложенный) DI-контейнера для решения данной задачи и дробление глобальной задачи на много мелких и реализация мелких, потом уже компоновка в инстурмент.