2013-03-04 27 views
-1

我正在討論一個論壇,我想保存數據庫中的用戶權限。 我的想法是這樣的:作爲單個整數在數據庫中的多個權限

USER TABLE HAS: (besides name, login etc) 
fk_role_id 

ROLE TABLE HAS: 
role_id 
role_name 
role_rights 

然後,我有一個Enum與用戶權限和用戶等級:

[Flags] public enum PermissionTypes : int { 
    None = 0, 
    Register = 1, 
    ThreadCreate = 2, 
    ThreadEdit = 4, 
    ThreadDelete = 8, 
    ReplyCreate = 16, 
    ReplyEdit = 32, 
    ReplyDelete = 64, 
    CatCreate = 128, 
    CatEdit = 256, 
    CatDelete = 512, 
    UserCreate = 1024, 
    UserEdit = 2048, 
    UserDelete = 4096, 

    All = Register | ThreadCreate | ThreadEdit | ThreadDelete | ReplyCreate | ReplyEdit | ReplyDelete | CatCreate | CatEdit | CatDelete | UserCreate | UserEdit | UserDelete 
} 

public class User { 
    public PermissionTypes Permissions = PermissionTypes.None; 
} 

現在是有可能的用戶權限保存爲role_rights一個詮釋?並再次離開他們的場外?

UPDATE:

只是爲了clearify我的問題是什麼... Fx的。如果我有一個用戶的權限:CatCreate & UserCreate,這將給我總共:1152 ... 現在我將如何使用該數字來測試用戶擁有什麼權限?現在它是一個小數點

+0

你認爲你是做這種方式節省? http://www.sqlperformance.com/2012/08/t-sql-queries/dry-principle – 2013-03-04 13:07:11

+0

但問題是什麼?當然你知道如何存儲一個整數並查詢它? – usr 2013-03-04 13:09:42

+0

剛剛更新了我的問題...而我猜即時嘗試不,必須使功能用戶可以訪問,另一個綁定功能的角色... 因此,我只需要一個角色表,與小數,並從那我可以看到用戶可以訪問... – 2013-03-04 13:51:56

回答

1

是的。

如果你想檢查某個值,例如「CatDelete」,你可以這樣做:Permissions & PermissionTypes.CatDelete == PermissionTypes.CatDelete

要刪除一個值:Permissions &= ~PermissionTypes.CatDelete

要添加一個值:Permissions |= PermissionTypes.CatDelete

+0

是的,但我的問題是我如何在DB中保存用戶權限... 使用此方法時... – 2013-03-04 12:48:44

+1

類似於「」更新用戶SET權限=「+(int)權限+」WHERE ID =「+ ID' ...但是請爲此使用sqlcommand +參數。 ^^; – Corak 2013-03-04 12:51:40

+0

好的,如果你有一個單獨的「角色」表,你可能需要在表格中有一箇中間的n來表示「UserRoles或者其他東西。你剛纔擁有UserID和RoleID(以及它們的組合都是唯一的)。在用戶表中只有一個「組合的」FK字段 – Corak 2013-03-04 12:54:44