How would you implement this using a Access Database?
You only need a single field to store you OR'ed bitmask
value. Does not matter what database you use.
Hi - Great post :)
Forgive me if I have missed something here - I see how
you grant permissions by adding the values to the
"bucket" but how do you revoke a permisson? Can you post
an example of the code to remove the "post" permission
from a user who has all 3 permissons? I have an
application using bitmasks to control runtime options
and there are quite a few. Assembling some static
combinations just isn't possible.
Help!
hi Lee, to clear a flag you can use the bitwise
&(AND) operator combined with the ~(NOT). I have
covered both the bitwise (&) / (~) operators in a
previous post.
You can read about them here :
http://weblogs.asp.net/alessandro/archive/2007/10/02/bitwise-operators-in-c-or-xor-and-amp-amp-not.aspx
protected void Page_Load(object sender, EventArgs e)
{
int View = 1;
int Post = 2;
int Reply = 4;
int ViewAndPostAndReply = View | Post | Reply;
Response.Write(string.Format("
{0}: View and post and reply", ViewAndPostAndReply));
int removePost = ViewAndPostAndReply &~Post;
Response.Write(string.Format("
{0}: Removed post", removePost));
if ((removePost & Post) == Post)
Response.Write("
Permission has post privileges");
else
Response.Write("
Permission does not have post privileges");
}
have a good day
Great post :)
I have one quick question. Can we use this with Code
Security attributes (PrincipalPermissionAttributes)? Can
you please share your thoughts on this.
Thanks
You could replace the static ints with the following,
correct?
[Flags]
public enum testing
{
View = 1,
Post = 2,
Reply = 4,
ViewAndReply = 5
}
Great post! Regarding Anon's question - assigning
ViewAndReply = 5 - I think that won't work, since 5 is
not a power of two. Am I correct?
Thanks for the clean and simple explanation.
Great post! Thank you. The comment about negating or
revoking a permission was helpful as well, as my current
project requires both.
I do have to disagree with one point though. Us
programmers tend to like our data stored in a way which
closely mirrors what we intend to do with it, but it's
always better to keep your data normalized even if you
want to consume it in a flattened state.
For instance:
Let's say I have a Roles table:
RoleId RoleName
------ --------
1 View
2 Edit
And I have a linker table to a Users table called
UserRoles
UserId RoleId
------ ------
In my code I have an enum for Roles:
public enum Roles
{
View,
Edit
}
Using Linq it's pretty easy to flatten my data into the
"buckets" I prefer to work with:
(assume userId was passed into this method)