Bir web sitesinin içindeki grupları yapısı nasıl?

7 Cevap php

Ben küçük bir kullanıcı sistemi yapmak için gkimlikiyorum ama sorularım var.

  1. Ben bir kayıt tablosu (mysql) yapmak olsaydı, sadece ne şifreleme olmadan veritabanına şifre ve kullanıcı adı depolama ile yanlış?

  2. Ben yönetici kısmını inşa etmek için nasıl düşünmeye çalışıyorum. Ben sadece kullanıcı yönetici olup olmadığını görmek için veritabanında bir sütununu kontrol etmelkimlikir? Eğer doğruysa, bu durumda admin sayfa ortaya çıkacak.

  3. Kullanıcıya onaylaması, kullanıcıyı silmek ve kullanıcıyı taşımak: admin güçler için, en I 3 güçlerim var diyelim. Birkaç senaryolarda, bazı insanlar sadece onaylamak veya silmek için yetenek, ya da tüm veya herhangi bir kombinasyonunu vermek isteyebilirsiniz. Bunu nasıl yapmak istiyorsunuz? Ben her iktkimlikar için bir sütun olan düşünme ve komut her sütunu kontrol var kimliki. Diyelim ki eklenecek 20 üzerinde yetkilere sahip varsayalım.

  4. İnsanların grupları oluşturmak ve bunların gruplarının yöneticileri olmak ve bu yöneticileri ex için kendi grubundaki insanların (admin güçlerin farklı kombinasyon verebilir bir web siteniz varsa, Zack oluşturur ve yeteneği bir üye Dağ ve hibe olarak adlveırılan grup yeni onaylamak grup üyeleri ve ikinci aydan üyeleri silmek için yeteneği verir ve üçüncü aydan Nasıl MySQL bu yapısı olacaktır silmek ve onaylamak için yeteneği. atar? Ben admin ne grup söylüyorlar sütunları kullanmalı mıyım ve ne yetenek yaptıkları var Örneğin sütunlar:?, GroupMemberOf, GroupAdminOf ve kullanım kontrolleri Onayla, sil.

Benim bir fikrim var ama daha sofistike yollarını öğrenmek istiyorum.

Thanks for the answers so far, however, I am really looking for kimlikeas on a structure ( Question 2 - 4 ). Ben soru kadar net yardımcı olabilir eğer bana bildirin lütfen.

7 Cevap

  1. Eşsiz veritabanı bir yabancı tarafından erişilebilir, onlar şifreleri şifresini değil, böylece her kullanıcı için tuzları, ve tuz hafifletir ile karma kullanıcı şifreleri rainbow table attacks.

. (: Üye, 2: moderatör (onayı), 3: 1 admin) - 2 4 erişim seviyeleri için bir tablo kullanın ve bu gibi çok-çok bağlantıları saklamak için kullanıcı izinlerini başka farklı tabloyu kullanın:

id (auto_increment)|usr_id|role_id|group_id
-------------------------------------------
1                  |1     |3      |-1
2                  |2     |2      |1
3                  |2     |3      |2
4                  |3     |1      |2

Senin durumunda, kullanıcı 1 bütün site için admin, kullanıcı 2 grup 2 grup 3 ve moderatör için admin, kullanıcı 3 grup 2 üyesidir.

[EDIT:]

Farklı roller için yetkilerini kısıtlayan biraz daha düşünceler: ayarlarınıza bağlı olarak, örneğin, bir sayfa başına temelinde bazı rolü uygulanmasını kullanmalısınız MVC çerçevede, ben aksi bir istisna olmalı, her yöntem için çağrılacak olan (rolü) yetki fonksiyonunu gerektiren baz denetleyicisi uzanacak. Oturum kullanıcı gerekmez Yöntemleri (sayfa), bir kukla yetkilendirme kullanabilirsiniz.

Yani yetki sınıf gibi görünecek

class Authorization
{
    public $authorized = false;

    public function dummy()
    {
    	$this->authorized = true;
    }

    public function member($usr_id, $group_id = null)
    {
    	$sql = "SELECT usr_id FROM usr_roles WHERE usr_id = " . $usr_id . ($group_id !== null) ? " AND group_id " . $group_id : "";
    	// count the results of $sql query
    	// or some more stuff
    	if ($results > 1)
    	{
       		$this->authorized = true;
    	}
    	else
    	{
    		$this->authorized = false;
    	} 
    }

    // the other functions
}

Yeni temel denetleyicisi sınıf bu gibi görünecektir:

class BaseController extends Controller
{
    protected $authorization;
    public function __construct()
    {
    	$this->authorization = new Authorization();
    }

    public function render()
    {
    	if ($this->authorization->authorized === true)
    	{
    		parent::render
    	}
    	else
    	{
    		// redirect to not authorized page 
    	}
    }
}

Ve nihayet sonunda sizin denetleyicileri gibi görünecektir:

class IndexController extends BaseController
{
    // some stuff, methods etc.

    // methods needs logged in user and user must be a member. 
    public function index()
    {
    	$this->authorization->member($session_user->getId());
    }
}

[EDIT2:]

OOP ile aşina değilseniz, o zaman aşağıdakileri yapabilirsiniz:

Burada roller tablo için bir örnek düzeni:

role_id|role_name
-----------------
1      |member
2      |moderator
3      |admin

: Daha sonra bir fonksiyon Yetkilendir'i () tüm dosyaları dahil yapabilirsiniz

// role_name = "member", "moderator", "admin"
function authorize($usr_id = null, $role_name = null, group_id = null)
{
    // test for user in group and role, return boolean

}

Dosyalarınızı bu fonksiyonu içerir ve aşağıdakileri yapın içinde

if (authorize($usr_id, "moderator", 2)
{
    // show stuff, if user with $usr_id is moderator for group 2
}
else
{
    // do something else
}
// stuff for all

1) düz metin parolaları saklanması herkes veritabanına erişim elde etmezse, onlar yine şifreyi bilmek anlamına gelir. Tuzlama ve şifreleme şifreleri etrafında yutturmaca basit bir yöntem herkes için sadece iyi yapacağız, oldukça saçma.

$password = "Mypassword";
$salt = "a unique and constant string";
$password = md5($password.$salt);

Eğer md5 ile şifrelemek sonra ne bu yok aracılığıyla bir şifre şifreler md5();, geri şifreyi alamıyorum (). Ayrıca bunu Tuzlama sadece şifreyi bulmak için yolu yok olmasını sağlar.

Karşılaştırmak ve şifre sadece giriş aşağıdaki gibi aynı şekilde md5, çalışıp çalışmadığını görmek istiyorsanız:

$password = "check_this_password";
if(md5($password.$salt) === $originalPassword) 
{ 
    //same password
}

2) Bu soru şeylerin yönetici tarafında gruplara entegre etmek istiyorum nasıl bağlıdır. Başka hiçbir izinleri kurulum tüm varsa, sadece hesap seviyesi ile veritabanındaki tek bir alan saklamak için güvenli. Aksi takdirde, bir yönetici ya da olup olmadığını öğrenmek için sonraki nokta kullanın.

3) bir izin sistemi uygulamak için basit yolu, bu gibi başka yollar var ama bunu zorlaştırmak için değil iyi olması. Her grup için izinleri istedi Eğer prm_group_id gibi ek bir sütun eklemek ve belirli bir grubun izniyle her kullanıcı bulmak olabilir. Ama yine de, burada nasıl çalışıyor:

Izinleri tutmak için bir tablo oluşturmak

prm_user_id  | prm_permission
   0         | Admin
   0         | Delete
   1         | Add

Each row holds a flag or permission. Then it's quite simple to find out if they have the required permission through a bit of SQL and PHP.

function hasPermission($permission, $userID)
{
  $permissions = array();

  $sql = "SELECT prm_permission FROM user_permissions WHERE prm_user_id = $userID";
  $query = mysql_query($sql);

  while($data = mysql_fetch_array($query))
  {
     $permissions[] = $data['prm_permission'];
  }

  //Check if they have a permission with this:
  if(in_array($permission, $permissions))
  {
     return true;
  }
return false;
}

Bu ekleme ve oldukça kolay izinleri silme ve kontrol ve onlar bir izniniz varsa görmek için izin verir. Sadece olumsuz yönetme izinleri Abit zor alabiliriz.

1 - Ben her kullanıcı için benzersiz bir tuz kullanarak parolalarınızı şifrelemek öneririm. Sistem hiç compromized eğer Bu şekilde, kullanıcıların şifreleri (kendi açınızdan daha hacking olmadan) korsanlara karşı geçerli olmayacaktır

http://phpsec.org/articles/2005/password-hashing.html (biraz eski, ama var bazı iyi bilgi)

2, 3, 4 - Tüm bu web dillerinden geniş bir dizi ile mümkündür. Ben ilk veritabanı tasarımı üzerinde okuma ve normalleşme ve tablo şema tür durumunuza ideal olacaktır ne bulmaktan öneririm. Eğer gelecekte yönetici kullanıcılara daha fazla yetki eklemeye karar verirseniz, size baştan bunun için tasarım ve gelecekte herhangi bir baş ağrısı önlemek ve hala geçerli gereklilikleri içinde olabilir.

http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html http://www.peachpit.com/articles/article.aspx?p=30885

  1. Açıkçası önerdi o karma saklamak için, ama çok iyi yapıyor değil faydası var. Gerçekten neye ihtiyacınız aşağı gelir.

2+. I threw together a little sql schema for this here

Temel olarak, kullanıcıları, grupları, ve ayrı ayrı tablolarda ihtiyaç permbits saklayın. Daha sonra, gruplar halinde kullanıcılara ortak gruplara kullanıcılar ve izinler. Bir kişi vermek "tüm" sadece programlama mantığı (PHP veya MySQL ya yordamı saklı) yeni kullanıcıya izinler tablosunda mevcut tüm izinlere verir emin olun. Böyle bir sorgu gerçekleştirmek olabilir MySQL bunu gerçekleştirmek için:

INSERT INTO group_user_permissions
    SELECT `group_user`.`groupid`, `group_user`.`userid`, `permission`.`permbit`
        FROM permission, `group_user`
    WHERE `group_user`.`groupid` = 1
        AND `group_user`.`userid` = 1

Bu verilen Groupıd ve kullanıcı'kimliği için group_user_permission tabloya tüm olası izinleri eklemek olacaktır (bu durumda 1 Groupıd ve kimliği 1).

Şimdi, nerede o kullanıcı, bu grup, bu yaptıkları için çalışıyoruz ne olursa olsun yapmak için izni olup olmadığını görmek için group_user_permission tabloya karşı çok basit bir sorgu çalıştırabilirsiniz izinlerini denetlemek için hiç ihtiyacınız. Eğer, permbits adlandırmak permbits ekleyebilir veya permbits kaldırmak için gerekiyorsa tabloları değiştirmek zorunda değilsiniz çünkü bu sonuçta esnek olduğunu.

Ayrıca, çünkü izni tablosunda dize tuşlarının kullanımı, sen (autoincrementing numaralarını kullanarak vs) bunları okurken mantıklı bir metin formatında bu değerleri kullanabilirsiniz. PHP kontroller bu gibi bakmak yapma:

if( $permbit === "approve" )

vs

if( $permbit === 1 )

İyi şanslar!

Bunun için oyuna biraz geciktim, ama CakePHP yetkisini yok nasıl bakmak isteyebilirsiniz. (PHP kullanarak iseniz CakePHP framework kullanarak kodlamak zorunda olmadan bu kontrol bazı verdiğini görebilirsiniz.)

user-permissions-and-cakephp

Ayrıca, ben ayrı, normal kullanıcı / parola tablo aşağıdaki gibi alanları içeren bir tablo olurdu olurdu bu yüzden kullanışlı sadece varlıklara karşı (örneğin CRUD veya Yönetici gibi) eylemlerin bir listesini tutmak için buldum.

PermID | Deny or Allow | Action | Entity

Daha sonra başka bir PermId grupları eşler tablo ve kullanıcıları ve haritalar başka var grupları (yinelemeli gerekirse) gruba (kişi zaten bahsettik gibi).

Reddet veya izin ver kullanımı inkar kullanımı ya DACL'leri izin ACL oluşturabilirsiniz araçları varsayılan (muhtemelen normalde iyi bir fikir değildir) bir harekete izin vermek için ise, ya da inkar etmek olan küçük bir grup ise Daha büyük bir biri içinde erişim. Açık bir grup / kullanıcı için bir varlığa karşı bir eylem Deny olmadığını genellikle görmek için ilk kontrol ediyorum.

Böylece gibi bir şey olabilir:

PermID | Type  | Action  | Entity
-------+-------+---------+------------
  1    | Allow | Read    | User_Entry
  2    | Allow | Delete  | User_Entry
  3    | Allow | Move    | User_Entry
  4    | Allow | Approve | User_Entry
  5    | Allow | Create  | User_Entry

Yani, bir örnek olarak, bir yönetici grup girişleri 1-5 eşlersiniz, "normal kullanıcı" grup 1 için harita ve olabilir Sadece 5. (Isterseniz grubu için, "kişi" veya "kullanıcı" olarak okunur).

Id | Grp    | PermId
---+--------+-----
 1 | Admin  | 1
 2 | Admin  | 2
 3 | Admin  | 3
 4 | Admin  | 4
 5 | Admin  | 5
 6 | Normal | 1
 7 | Normal | 5

Açıkçası bu yeni bir eylem ya da varlık (örneğin dizin) sadece şemasını değiştirmek gerek kalmadan tablolarına uygun girdileri ekleyerek bir durumda bulunuyor sisteminde ortaya çıktığında kolayca genişletilebilir. Örneğin, "All" eylemleri kullanmak ve belirli bir dışlanma için bir DACL kullanabilirsiniz. İşte her şeyi ama bir User_Entry silebilirsiniz Power User bulunuyor.

PermID | Type  | Action  | Entity
-------+-------+---------+------------
  6    | Allow | All     | User_Entry
  7    | Deny  | Delete  | User_Entry


Id | Grp    | PermId
---+--------+-----
 8 | Power  | 6
 9 | Power  | 7

Senin durumunda ben Ortaklıklar "ev grubu" ya da bir şey, örneğin anlamına gelecektir grup adını veya bazı belirteci dahil olabileceğini hayal ediyorum Yerine bir sysadmin olabilir sadece UserEntry daha {homegrp} / UserEntry.

Maalesef bu biraz woffley oldu ama ben bunu yüreğin olsun umut eğer. (Ben ... Bütün yol boyunca okumak sanmıyorum gibi herhangi bir önceki cevabı bu konuda konuştuk eğer özür dilemek)

Noktalarda 2-4 için, Role-Based Access Control bakmak isteyebilirsiniz.

2 .. Evet

Eğer izinleri sonlu sayıda varsa 3 .. Bu kadar basit

4 .. Ben bir kaç yıl önce yazmıştım, ve büyük bir şirkete ağır kullanımda bulunuyor. Eğer şema üzerinde daha fazla bilgi istiyorsanız bana ulaşın.