[wp-trac] [WordPress Trac] #2787: New Method of storing and
calculating cap2user and user2cap
WordPress Trac
wp-trac at lists.automattic.com
Sun Jun 4 23:00:04 GMT 2006
#2787: New Method of storing and calculating cap2user and user2cap
----------------------------+-----------------------------------------------
Id: 2787 | Status: new
Component: Administration | Modified: Sun Jun 4 23:00:04 2006
Severity: normal | Milestone: 2.1
Priority: normal | Version: 2.1
Owner: anonymous | Reporter: markjaquith
----------------------------+-----------------------------------------------
This idea came from a conversation I had with Ryan in #wordpress-dev
'''The Problem'''
The role/cap system is hindered by having much of its data buried in
arrays. User2cap is ridiculous.
'''The Solution'''
Roles are meaningless. Getting users who have role X proves nothing,
because they could have extra capabilities. Capabilities are the thing
you want. ''''Roles are just a capability container... a short way of
granting a bunch of capabilities to a user.'''' Once you realize that,
you see that what you really need is a cap2users table, that could double
as a users2cap table. That gives you one-query access to "what users can
do X?" and "What can user X do?"
'''How Roles Fit In'''
In order for the role2cap table to be correct, it would need to be updated
whenever:
* A user is given an extra capability
* A user is stripped of an extra capability
* A role is given an extra capability
* A role is stripped of an extra capability
* A user is moved to a different role
So we'd need a solid API for this. This is the heavy lifting... done only
when something is changed on the back end (infrequent).
'''Schema'''
* $wpdb->user2cap (per blog)
* * u2cid
* * user_id
* * cap_id
* * extra_cap
extra_cap would be a binary flag. Basically, it would say whether or not
this cap is associated with a role or not. It would be used on the
backend. The scenario is this:
User gets granted an extra cap, foo_bar. Then, they get upgrade to a new
role that includes foo_bar. The "extra_cap" flag stays on, because they
were granted this capability specifically. If they are then subsequently
downgraded in roles, or if the role is edited to now have foo_bar cap
anymore, they keep foo_bar cap, because it is an extra role. To strip
users of extra roles, you should have to specifically take it away.
Changing their role, or editing the role they have shouldn't mess with
their extra caps.
* $wpdb->usermeta (multiple blogs can share this)
* * wp_role => Administrator
* * wp_otherblog_role => Garbage Collector
* * wp_otherblog_role => Little League Coach
Note that a usermeta table can have roles for that user on different blogs
and that there can be multiple roles for each user, even on the same blog.
That just means that cap2user has all the capabilities of all the roles
that the user has, along with all extra caps (marked with extra_cap = 1).
The array that stores the Role => Cap information could stay as an array.
It would only be used in API functions on the back end.
Original conversation.
{{{
MarkJaquith: what do you think about doing all the heavy lifting on the
back end?
[6:32pm] MarkJaquith: like... just have user2cap
[6:33pm] MarkJaquith: don't grab the roles live when doing
current_user_can() or users_with_cap()
[6:33pm] MarkJaquith: calculate that when a user is changed or when roles
are changed, and populate user2cap
[6:34pm] MarkJaquith: who really cares if editing a user takes 4
queries... it's seldom done.
[6:34pm] rboren: That's fine.
[6:34pm] MarkJaquith: Roles are meaningless anyway
[6:34pm] MarkJaquith: this tells people to focus on capabilities
[6:34pm] MarkJaquith: define their role in usermeta. keep role2caps in an
array, it's only used when updating the user.
[6:35pm] rboren: We should be able to retrieve all users with a given cap
though.
[6:35pm] rboren: We don't do that very well now.
[6:35pm] MarkJaquith: user2cap doubles as cap2user, right?
[6:36pm] rboren: It can.
[6:36pm] MarkJaquith: SELECT DISTINCT user_id FROM $wpdb->cap2user WHERE
cap = 'foo';
[6:37pm] rboren: As long as cap2user contains the caps inherited from the
role.
[6:37pm] MarkJaquith: yes... calculated when things are changed
[6:37pm] rboren: We'd have to make sure that a role change updated all
affected users too.
[6:37pm] MarkJaquith: yep. we'd need that to be solid
[6:38pm] MarkJaquith: And we'd need to deactivate older versions of Owen's
Role Manager... they could really screw things up with that
[6:38pm] rboren: Okay. That sounds like a good possibility.
}}}
Paging Owen... your feedback is important on this one.
--
Ticket URL: <http://trac.wordpress.org/ticket/2787>
WordPress Trac <http://wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list