سؤال

وأنا عادة في مشاريعي استخدام مثل هذه كود:

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 الخاصة بك. وهذا يترجم تصميم DB الخاص بك إلى المستخدمين / الأدوار التي يمكن استخدامها. NET. بعد ذلك يمكنك استخدامه بمثابة عادة - مع user.isInRole("Admin"):)

وLDAP هو الخيار الأفضل للحصول على ترخيص والمصادقة. يمكنك استخدام API ب OpenLDAP لنفس الغرض.

قد يكون أنا يجب أن تكون أكثر وضوحا، ولكن أنا لا أعرف كيف :). ساحاول مرة اخرى.

وعلى سبيل المثال يمكنني استخدام لبلدي deletebutton هذا الرمز:

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

وبعد عملية الشراء ككل، اتخاذ قرار بأن يكون لدى المستخدم دور "الوسيط" يجب أن نرى أيضا زر حذف. لذلك أود أن تغيير قانون بلدي مثل هذا:

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

وإذا كان لدي تصميم قاعدة البيانات لاتخاذ السيطرة على هذا، لم أكن في حاجة إلى تغيير قانون بلدي لذلك.

حسنا، كيف يجب أن يكون؟

حسنا، تصميم واحد هو أن تكون الجداول مثل:

User(UserID, ...) PK = UserID

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

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

وهذا هو أسلوب واحد. هذا هو نظام دور القائم بدلا من التقديري، الكائن مقرها نظام ترخيص (في نظام التقديري، وكنت تعيين أذونات على كل كائن، ويقول هذا المستخدم X لديه إذن DELETE للزبائن، أو شيء من هذا القبيل).

والرمز:

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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top