2008-08-19 27 views
8

Tôi đã cố thực hiện việc này vài lần mà không có may mắn. Sau khi đọc this post, nó khiến tôi thích làm điều này một lần nữa. Vì vậy, bất cứ ai có thể cho tôi biết lý do tại sao sau đây không hoạt động?Thực hiện các quyền trong PHP

<?php 

$guest = 1; 
$editor = 2; 
$admin = 4; 

$user = $editor; 

if($user == ($editor | $admin)) { 
    echo "Test";  
} 

?> 

Trả lời

11

Sử dụng các phép toán tử OR (|) để thiết lập bit, sử dụng và khai thác (&) để kiểm tra bit. Mã của bạn sẽ trông giống như sau:

<?php 

    $guest = 1; 
    $editor = 2; 
    $admin = 4; 

    $user = $editor; 

    if($user & ($editor | $admin)) { 
     echo "Test";  
    } 

?> 

Nếu bạn không hiểu nhị phân và chính xác những gì nhà khai thác bitwise làm, bạn nên tìm hiểu. Bạn sẽ hiểu làm thế nào để làm điều này tốt hơn nhiều.

2

Nó được một thời gian dài kể từ khi tôi sử dụng PHP, nhưng tôi sẽ cho rằng điều này sẽ làm việc:

<?php 

    $guest = 1; 
    $editor = 2; 
    $admin = 4; 

    $user = $editor; 

    if(($user == $editor) || ($user == $admin)) { 
     echo "Test";  
    } 

?> 
1

(2 | 4) đang được đánh giá là 6, nhưng 2 == 6 là sai.

1

@mk: (2 | 4) để đánh giá 6.

1
$guest = 1; 
$editor = 2; 
$admin = 4; 

$user = $editor; 

if (user == $editor || $user == $admin) { 
    echo "Test"; 
} 
1

Awesome, này có vẻ như cách tốt nhất để làm điều khoản trong một CMS. Vâng? Không?

Có thể, tôi chưa bao giờ thực sự thực hiện theo cách đó. Những gì tôi đã làm được sử dụng các toán tử bitwise để lưu trữ toàn bộ các cài đặt "có hoặc không" trong một số duy nhất trong một cột duy nhất trong cơ sở dữ liệu.

Tôi đoán quyền, cách này sẽ hoạt động tốt nếu bạn muốn lưu trữ quyền trong cơ sở dữ liệu. Nếu ai đó muốn gửi một số nội dung, và chỉ muốn quản trị viên và biên tập viên để nhìn thấy nó, bạn chỉ cần có để lưu trữ kết quả của

($editor | $admin) 

vào cơ sở dữ liệu, sau đó để kiểm tra xem nó, làm cái gì đó như

if ($user & $database_row['permissions']) { 
     // display content 
} else { 
     // display permissions error 
} 
0

Theo ý kiến ​​của tôi, điều này không quy mô tốt. Tôi đã không thực sự cố gắng sử dụng nó trên một dự án quy mô lớn, nhưng một CMS âm thanh cách phức tạp để sử dụng này trên.

6

Vì lợi ích của việc không phát minh lại bánh xe, tại sao không xem xét các hệ thống ACL/Xác thực như Zend ACLZend Auth? Cả hai có thể được sử dụng độc lập từ khung công tác Zend. Kiểm soát truy cập là một tình huống khó khăn để nó có lợi cho một ít nhất là xem xét cách các hệ thống khác làm điều đó.

0

Nó luôn phụ thuộc vào những gì bạn cần. Nếu bạn biết Zend Framework đã có, thì tôi sẽ làm theo gợi ý Zend_Acl/_Auth thứ hai đã được thực hiện trước đó. Nhưng hãy nhớ rằng mọi khung công tác đều đi kèm với một thành phần tương tự.

Điều khác mà bạn nghĩ đến là LiveUser. Tôi thích làm việc với nó rất nhiều.

Tôi nghĩ bạn có thể làm khá nhiều thứ và trong khi cách tiếp cận của bạn trông rất đơn giản, nó cũng bị giới hạn (thông qua tất cả những gì nếu()) bạn sẽ đặt rất nhiều quyền ACL ở giữa ứng dụng của bạn. Đó không phải là điều tuyệt vời nhất để làm cho nó đơn giản và có thể mở rộng được. ;)

2

Tôi đã sử dụng tính năng này trong báo cáo lỗi và hoạt động khá tốt.Đối với quyền người dùng, nó sẽ hoạt động rất tốt - bạn có thể có một số cột cho mỗi quyền người dùng trong cơ sở dữ liệu của bạn hoặc một cột userlevel trong cơ sở dữ liệu của bạn. Đi cho tùy chọn này.

Các vấn đề liên quan