Help modeling a User/Group permission structure

Hello,

I've worked through some rails tutorials and am trying to create something a little more complicated for learning purposes. I'm trying to extend a blog application into more of a cms with a basic user/ group permission system.

Basically, I have Users, Articles and Groups. Users can have a role of either: Author or Viewer. Some articles are private and some are public. For private articles, I'd like to have a system where an article can be permissioned to either a group or to an individual user or even both.

When a website visitor tries to access an article AND the article is 'Private', I'd like for the system to prompt the visitor to login. Once logged in, I want the system to then check if this user has permission to view the article. Permission being defined as: if this user is either in a group that has permission to the article OR the user himself has explicit permission to that article.

Here's what I currently have - does this make sense? I'm mostly struggling with the Article_Private_Access model and whether this is a good approach.

Users:   name   email   password   role (role is either 'Author' or 'Viewer')

Group_Users   group_id   user_id

Groups:   name

Articles   user_id   access_type ('Private' or 'Public')   title   body

Article_Private_Access (** this serves to link Articles with permissioned Users or Groups)   article_id   access_type ('Group' or 'User')   access_id (this id would point to either a User record, or a Group record)

The tables you have seem to make sense to me.

For the Article Private Access table appears to be a one to one on Article, you could dispense with this table and put the fields into the Articles table. Either as you have them, access_type, access_id. Or access_id, group_id. With the latter, an article could be accessible by a group or a user or both.

If you only want Access by group OR user, then another approach might be to use two different article tables, eg. Group_Article and User_Article. I am doing something similar at the moment, where I have bookings that can belong to an Order or a Quote. I am still thinking about it, but it looks to me like having order_bookings and quote_bookings may possibly be a cleaner solution. In your case however, that is probably not the case.

Others may have better ideas. HTH tonypm

thanks for the response. as for breaking articles into 2 tables, i prefer to keep a single table. i think in your case 2 tables would be better.

also, i'm not sure how there would be a 1-1 relationship between my article_private_access table with articles.

here's how i envision the data

Users id name 1 Jim 2 John 3 Mary 4 Ed 5 Fred

Articles id title user_id access_type 1 Some article title 1 PRIVATE

Groups id name 1 Group1

Groups_Users group_id user_id 1 2 1 4

Article_Private_Access article_id access_type access_id 1 Group 1 1 User 3

This would allow "Article 1" (published by Jim) to be accessible by: Group1 (which contains John, Ed) and accessible by user Mary. Fred would not be entitled to access this article

Is there an easier way? I feel as though I may have a lot of logic to loop through these Article_Private_Access lists that I'd like to simplify.