我通常在我的項目中使用這些等代碼:如何設計數據庫的授權和認證
If user.IsInRole("Admin") Then
deleteButton.Visible = True
else
deleteButton.Visible = False
但我想控制的角色,它可以在數據庫中看到此按鈕。
爲此,數據庫設計應該如何?
謝謝。
我通常在我的項目中使用這些等代碼:如何設計數據庫的授權和認證
If user.IsInRole("Admin") Then
deleteButton.Visible = True
else
deleteButton.Visible = False
但我想控制的角色,它可以在數據庫中看到此按鈕。
爲此,數據庫設計應該如何?
謝謝。
假設您使用.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" });
無論你想成爲什麼樣的設計,但在ASP.NET端實現你自己的MembershipProvider。這會將您的數據庫設計轉換爲.NET可以使用的用戶/角色。之後,你可以作爲平時使用它 - 與user.isInRole("Admin")
:)
嘛,一個設計是具有表,如:
User(UserID, ...) PK = UserID
Role(RoleID, RoleName, ...) PK = RoleID
UserHasRole(UserHasRoleID, UserID, RoleID) PK=UserHasRoleID ; Unique= (UserID, RoleID)
這是一種方法。這是一個基於角色的系統,而不是一個任意的基於對象的授權系統(在一個任意的系統中,你可以爲每個對象設置權限,比如說這個用戶x具有對客戶的DELETE權限,或類似的東西)。
可能是我應該更清楚,但我不知道如何:)。我會再試一次。
例如我用我的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
如果我有一個數據庫設計採取控制這一點,我並不需要更改我的代碼吧。
那麼,它應該怎麼樣?
LDAP是用於授權和驗證的最佳選擇。 您可以將openLDAP API用於相同的目的。
代碼:
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>
爲什麼不deleteButton.Visible = user.isInRole( 「管理」)???? – 2008-12-08 08:10:29
是的,你的代碼更好,但我只是把它作爲一個例子;) – mavera 2008-12-08 09:12:49
一個不好的例子,BTW。請改變你的問題。好痛。 – 2008-12-24 02:49:02