2008-12-08 97 views
3

我通常在我的項目中使用這些等代碼:如何設計數據庫的授權和認證

If user.IsInRole("Admin") Then 
    deleteButton.Visible = True 
else 
    deleteButton.Visible = False 

但我想控制的角色,它可以在數據庫中看到此按鈕。

爲此,數據庫設計應該如何?

謝謝。

+1

爲什麼不deleteButton.Visible = user.isInRole( 「管理」)???? – 2008-12-08 08:10:29

+1

是的,你的代碼更好,但我只是把它作爲一個例子;) – mavera 2008-12-08 09:12:49

+0

一個不好的例子,BTW。請改變你的問題。好痛。 – 2008-12-24 02:49:02

回答

-1

假設您使用.NET,一種方法是實現您自己的角色和成員資格提供程序。然後,您可以通過實施包含你想要的物品的界面添加功能(我剛剛敲這個樣本起來了我的頭頂部,所以我道歉,如果這似乎有點粗糙):

public interface ICustomRole 
{ 
    bool IsInRole(string userName, object[] params roles); 
} 

public class MyCustomRole : RoleProvider, ICustomRole 
{ 
    public IsInRole(MembershipUser user, object[] params roles) 
    { 
    if (roles == null || roles.Length == 0) 
     throw new ArgumentException("roles"); 
    // Put your logic here for accessing the roles 
    } 
} 

然後,在你的代碼,你會做到這一點:

bool isValid = ((ICustomRole)Roles.Provider).IsInRole(
    User, new[] { "Admin", "Moderator", "Validator" }); 
1

無論你想成爲什麼樣的設計,但在ASP.NET端實現你自己的MembershipProvider。這會將您的數據庫設計轉換爲.NET可以使用的用戶/角色。之後,你可以作爲平時使用它 - 與user.isInRole("Admin") :)

0

嘛,一個設計是具有表,如:

User(UserID, ...) PK = UserID 

Role(RoleID, RoleName, ...) PK = RoleID 

UserHasRole(UserHasRoleID, UserID, RoleID) PK=UserHasRoleID ; Unique= (UserID, RoleID) 

這是一種方法。這是一個基於角色的系統,而不是一個任意的基於對象的授權系統(在一個任意的系統中,你可以爲每個對象設置權限,比如說這個用戶x具有對客戶的DELETE權限,或類似的東西)。

0

可能是我應該更清楚,但我不知道如何:)。我會再試一次。

例如我用我的deletebutton驗證碼:

if user.isInRole("Admin") then 
    deleteButton.visible = true 
else 
    deleteButton.visible = false 

AFTE一個整體,作出這樣的,用戶有角色「主持人」也應該看到刪除按鈕的決定。所以,我要改變我的代碼是這樣的:

if user.isInRole("Admin","Moderator") then 
    deleteButton.visible = true 
else 
    deleteButton.visible = false 

如果我有一個數據庫設計採取控制這一點,我並不需要更改我的代碼吧。

那麼,它應該怎麼樣?

1

LDAP是用於授權和驗證的最佳選擇。 您可以將openLDAP API用於相同的目的。

0

代碼:

public class YourSqlRoleProvider : System.Web.Security.RoleProvider 
{ 
    private string ConnectionString { get; set; } 

    public override void AddUsersToRoles(string[] userNames, string[] roleNames) 
    { 
     // logic here 
    } 

    public override string ApplicationName 
    { 
     get 
     { 
      throw new NotSupportedException(); 
     } 
     set 
     { 
      throw new NotSupportedException(); 
     } 
    } 

    public override void CreateRole(string roleName) 
    { 
     throw new NotSupportedException(); 
    } 

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotSupportedException(); 
    } 

    public override string[] FindUsersInRole(string roleName, string userNameToMatch) 
    { 
     throw new NotSupportedException(); 
    } 

    public override string[] GetAllRoles() 
    { 
     // logic here 
    } 

    public override string[] GetRolesForUser(string userName) 
    { 
     // logic here 
    } 

    public override string[] GetUsersInRole(string roleName) 
    { 
     throw new NotSupportedException(); 
    } 

    public override bool IsUserInRole(string userName, string roleName) 
    { 
     return GetRolesForUser(userName).Contains(roleName); 
    } 

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
    { 
     this.ConnectionString = ConfigurationManager.ConnectionStrings[config["connectionStringName"]].ConnectionString; 

     base.Initialize(name, config); 
    } 

    public override void RemoveUsersFromRoles(string[] userNames, string[] roleNames) 
    { 
     throw new NotSupportedException(); 
    } 

    public override bool RoleExists(string roleName) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Web.config文件:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <connectionStrings> 
     <clear /> 
     <add name="YourConnectionString" providerName="System.Data.SqlClient" connectionString="connection string here" /> 
    </connectionStrings> 
    <system.web> 
     <roleManager defaultProvider="YourSqlRoleProvider" enabled="true"> 
      <providers> 
       <clear /> 
       <add name="YourSqlRoleProvider" type="YourSqlRoleProvider" connectionStringName="YourConnectionString" /> 
      </providers> 
     </roleManager> 
    </system.web> 
</configuration>