Nasıl forum ayrıcalıkları uygulayabilirsiniz

4 Cevap php

Benim MVC Framework üzerinde PHP bir forum uygulaması geliştirirken başladım ve ben üyelerine izinleri atamak sahneye var (örneğin: OKU, DELETE, UPDATE, YAZ).

Şimdi, benim veritabanındaki kullanıcı masanın altında 5 sütun eklemek ve 1 bunları biliyorum | 0, ama diğer kuralları eklemek isterseniz bana bu örneğin HAREKET gibi, çok fazla gibi görünüyor.

Ve nasıl dinamik olarak bireysel kullanıcılara bu ayrıcalıkları atayabilirsiniz?

Ben bir bitmaskları kullanarak duydum, ama ben devam etmeden önce ben onları tam olarak anlamak eğer gerçekten iyi olurdu.

Eğer ben bunu uygulamak nasıl bir örnek var mı?

4 Cevap

Eğer anlatılan yöntemi - bireysel ayrıcalıkları sütunlarda saklanır - (fark olarak) esneklik pahasına basittir.

Herhangi bir "TABLO DEĞİŞTİRME" ifadeleri gereksinimini ortadan kaldırır dışında Zuul metodu, daha basit ve sizin esas olarak aynıdır. Ancak, kolayca queryable ve kendinden belgeleyen değil, normalize değildir.

Bu yöntemlerin her ikisi ile bir başka sorun kullanıcı tabanı büyüdükçe, düzgün ayarlamak herkesin ayrıcalıklarını korumak için bir ağrı giderek daha bulacaksınız olmasıdır. Tam olarak aynı ayrıcalıklara gerek kullanıcıların bir sürü bulacaksınız. Henüz yeni bir ayrıcalık uyum gibi bir kullanıcının yetkilerini değiştirmek için, sen gidip tek tek ihtiyacı her kullanıcı bu ayrıcalığı eklemek zorunda olacak. Binbaşı PİDE.

Bir forum için, bu kullanıcı başına ayrıcalık yönetimini gerekir ki olası değil. Eğer Bu rol tabanlı erişim denetimi (RBAC) için çok uygundur kılacak vb anonim kullanıcıları, oturum açan kullanıcılar, moderatörler, yöneticiler, gibi kullanıcıların belirli sınıflara sahip olacak muhtemelen. Bu sistemde bir role her bir kullanıcı atamak ve rolü ayrıcalıklar vermek. Ayrıcalıklar bir "ayrıcalık" tablosundaki satır gibi saklanır. yani basitleştirilmiş veritabanı şeması gibi görünecektir:

PRIVILEGE
int id (primary key)
varchar description

ROLE_PRIVILEGE_JOIN
privilege_id (foreign key)
role_id (foreign key)

ROLE
int id (primary key)
varchar description

USER
int id (primary key)
int role_id (foreign key)

Bu desen kullanıcı ayrıcalıkları ile uğraşmak pek çok uygulamada kullanılmaktadır. Herkes belki ayrıcalık tabloda bir satır olarak olabilir her ayrıcalığı ekle; herhangi bir kullanıcı muhtemelen rol tabloda sahip olabilir, her bir rol ekleyin; ve role_privilege_join tabloda bunları uygun şekilde bağlamak.

Tek gerçek dezavantajı bir birleşim tablosu kullanılır, çünkü "kullanıcı X-Y yapabilirim" sorgu biraz daha yavaş olacak olmasıdır.

Açık veya kapalı olma iznini temsil eden her rakam ile, ikili olarak temsil zaman bir izinleri bit maskesi iyi anlaşılmaktadır. Izinleri X, Y ve Z var, ve ben sadece X ve Z erişiminiz varsa Yani, 101 saniye değil ben bana verilen ilk ve üçüncü izinlere sahip olduğunu temsil, ama olacaktır. Bu veritabanında saklanan sona ereceğini ne yani ikili sayı 101, ondalık sayı 5 eşdeğerdir. Bir tek, küçük tamsayı bir dize ya da birkaç küçük tamsayılar daha saklamak için çok daha verimli bir nesnedir.

EDIT: Ben gidiyor oldukça hızlı bir uygulama almak için varolan dönüştürme işlevlerini kaldıraç olduğunu ne kadar kolay olduğunu fark etti. İşte bir örnek.

<?php
function bitmask_expand($n) {
  // 9 returns array(1, 0, 0, 1)
  return str_split(base_convert($n, 10, 2));
}

function bitmask_compact($a) {
  // array(1, 0, 0, 1) returns 9
  return (int) base_convert(implode($a), 2, 10);
}

$ns = range(0, 7);
foreach($ns as $n) {
  print_r($b = bitmask_expand($n));
  echo bitmask_compact($b), "\n\n";
}

Eğer döngüler kullanmak eğer yerine dizeleri ve geri çekerek daha iyi performans alabilirsiniz, ama bu oldukça açıkça prensibini göstermektedir.

Ben "Roller" adında bir tablo oluşturmak olacaktır:

CREATE TABLE Roles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 rolename VARCHAR(30))

Orada istediğiniz sopa ne izinleri. Sonra rollere kullanıcıları bağlamak için "UserRoles" adında bir tablo oluşturun:

CREATE TABLE UserRoles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 UserId INT,
 RoleID INT)

Lots of flexibility and easy to build upon (ie workflow, rules, etc) (I would add foreign keys as well)

Sadece bir alan kullanmak, bu karmaşık gerek yok "ex: izinleri" ve benzeri bir şey yapın:

$ Izinleri = "1; 1; 0, 1";

endişe içinde okur burada:

OKUYUN - 1 (can)

WRITE - 1 (can)

GÜNCELLEME - 0 (Yapamam)

DELETE - 1 (can)

";" kontrol ederken daha sonra, sadece tarafından "patlayabilir" kullanın ...

Bu şekilde, her zaman tabloyu değiştirmeden daha izinler türlerini uygulayabilirsiniz ... böylece sizin masa küçük olsun, ve sorgu daha hızlı!

Bu sorun için bir çözüm var :)