I'm using Catalyst with Catalyst::Plugin::Authentication
and
Catalyst::Plugin::Authorization::Roles
and am wondering if there is a better
approach to adding an attribute to a model that I'm not seeing.
Each user is permitted to access one or more companies, but there is
always one primary (current) company at a time. The permitted list is
stored in the database, and database access is primarily through DBIC
.
My first inclination is to say that it's the user that has a current
company, and thus put it as part of the user model: give the user
package a "sub company { … }
" to get/set the user's current company. The
database check is fairly easy; just use "$self->search_related
" (a DBIC
method, inherited by the user model).
The problems I run in to are:
- The current company needs to persist between requests, but I'd rather not store it to the database (it should only persist for this session). The natural place is the session…
- There is a role, akin to Unix's
root
, that allows you to act as any company, ignoring the list in the database. Checking this role can be done through the database, but everywhere else in the app uses$c->assert_user_role
and friends.
I've heard its best to keep the models as Catalyst-independent as
possible. It also seems pretty weird to have a model manipulating
$c->session
.
Of course, I could move those checks to the controllers, and have the model accept whatever the controller sends, but that's violating DRY pretty heavily, and just begging for a security issue if I forget one of the checks somewhere.
Any suggestions? Or do I just shrug and go ahead and do it in the model?
Thanks, and apologies for the title, I couldn't come up with a good one.