Как разработать базу данных для авторизации и аутентификации - PullRequest
3 голосов
/ 08 декабря 2008

Я обычно в своих проектах использую такой код:

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

Но я хочу контролировать роли, которые могут видеть эту кнопку в базе данных.

Для этого каким должен быть дизайн базы данных?

Спасибо.

Ответы [ 6 ]

1 голос
/ 25 октября 2010

LDAP - лучший вариант для авторизации и аутентификации. Вы можете использовать openLDAP API для той же цели.

1 голос
/ 08 декабря 2008

Сделайте дизайн таким, каким хотите, но на стороне ASP.NET реализуйте свой собственный MembershipProvider. Это преобразует ваш дизайн БД в пользователей / роли, которые может использовать .NET. После этого вы можете использовать его как обычно - с user.isInRole("Admin"):)

0 голосов
/ 25 октября 2010

Код:

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>
0 голосов
/ 08 декабря 2008

Предполагая, что вы используете .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" });
0 голосов
/ 08 декабря 2008

Может быть, я должен быть более ясным, но я не знаю как :). Я попробую снова.

Например, я использую для своей кнопки удаления этот код:

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

Если у меня есть дизайн базы данных, чтобы взять это под контроль, мне не нужно было менять свой код для него.

Ну, как это должно быть?

0 голосов
/ 08 декабря 2008

Ну, один дизайн должен иметь такие таблицы, как:

User(UserID, ...) PK = UserID

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

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

Это один из методов. Это система на основе ролей, а не дискреционная система авторизации на основе объектов (в дискреционной системе вы устанавливаете разрешения для каждого объекта, скажем, у этого пользователя x есть разрешение DELETE для клиентов или что-то в этом роде).

...