Я пишу свое первое приложение MVC на PHP. Я не хочу использовать какие-либо рамки.
Сейчас я ищу хорошее решение или лучшую практику для отображения элементов для пользователей в представлениях, только если им разрешено взаимодействовать с функцией, которую вызывает определенный элемент.
Приложение загружает файл шаблона в представлении.
В файле шаблона я показываю данные из модели, которые передаются из контроллера в представление.
От контроллера
public function showUserList() {
$userList = $this->model->getUserList();
$this->view->loadTemplate($userList, 'user_list.php');
}
Из вида:
class user_view {
public function loadTemplate($data, $file, $buffer= false){
if($buffer === true){
ob_start();
include dirname(__FILE__).'/templates/'.$file;
$c = ob_get_contents();
ob_end_clean();
return $c;
}else{
include dirname(__FILE__).'/templates/'.$file;
}
}
}
Шаблон:
<table class="table" id="data-table">
<thead>
<tr>
<th>Name</th>
<th>Username</th>
<th>E-Mail</th>
<th>Group</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php
if(is_array($data)){
foreach($data as $key => $value){
?>
<tr>
<td><?php echo $data['name'].' '.$data['surname']; ?></td>
<td><?php echo $data['abbr']; ?></td>
<td><?php echo $data['email']; ?></td>
<td><?php echo $data['gr_name']; ?></td>
<td>
<div data-access="," onclick="$user_controller.showUserChangeView('<?php echo $data['id']; ?>')" class="btn btn-primary">edit</div>
<div data-access="checkAccess" onclick="$user_controller.deleteUser('<?php echo $data['id']; ?>')" class="btn btn-danger">delete</div>
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</div>
Я хочу отображать только кнопки или элементы меню, если пользователю разрешено вызывать функцию кнопки или пункт меню.
Мой первый подход заключается в создании файла шаблона со всеми элементами, которые могут быть отображены. Элементы, которые не должны быть доступны для всех пользователей, получают атрибут данных.
Представление загружает шаблон, анализатор DOM разбирает файл, проверяет, разрешено ли пользователю вызывать эту функцию с атрибутом данных.
Если пользователю не разрешено вызывать эту функцию, элемент будет удален.
Это еще не реализовано, потому что я не уверен, что это хорошее решение или как я могу сделать это еще лучше?
Мое предложение заключается в реализации либо ACL (список контроля доступа) или же RBAC (управление доступом на основе ролей) в зависимости от того, что вы найдете полезным. Я предпочитаю RBAC, поэтому приведу минималистичный пример.
Создайте список всех возможных действий, которые может выполнять пользователь, и определите роли, которые могут иметь к ним доступ.
// List of permissions (the actual term to define resources in RBAC) for the users
$actions = array(
'view' => array(ROLE_USER, ROLE_OWNER, ROLE_MANAGER, ROLE_ADMIN),
'edit' => array(ROLE_OWNER, ROLE_ADMIN),
'delete' => array(ROLE_OWNER, ROLE_ADMIN),
'change_pass' => array(ROLE_OWNER, ROLE_MANAGER, ROLE_ADMIN)
)
Теперь, когда вы отображаете кнопку для этих действий, вы можете проверить, имеет ли текущий пользователь какую-либо роль, которая позволяет ему получить доступ к действиям. Если ответ «да», то покажите им, иначе не показывайте их вообще.
$currentUserRole = '..'; //Retrieve however you want
foreach($actions as $allowed_roles) {
if(in_array($currentUserRole, $allowed_roels)) {
echo "<div ...>"; // Basically show the action
}
// If not carry on to next action with out showing
}
(Замечания: Недостаточно только показа может быть недостаточно для его защиты, поэтому мы также должны проверять его при выполнении действия)
Обновить: Вы должны поместить вышеуказанный код в следующую часть:
<table class="table" id="data-table">
<thead>
<tr>
<th>Name</th>
<th>Username</th>
<th>E-Mail</th>
<th>Group</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php
if(is_array($data)){
foreach($data as $key => $value){
?>
<tr>
<td><?php echo $data['name'].' '.$data['surname']; ?></td>
<td><?php echo $data['abbr']; ?></td>
<td><?php echo $data['email']; ?></td>
<td><?php echo $data['gr_name']; ?></td>
<td>
$currentUserRole = '..'; //Retrieve however you want
foreach($actions as $allowed_roles) {
if(in_array($currentUserRole, $allowed_roels)) {
echo "<div ...>"; // Basically show the action
}
// If not carry on to next action with out showing
}
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</div>
Других решений пока нет …