Как мне писать HTML и т. Д. Для ролей безопасности в приложении, которое я унаследовал? - PullRequest
1 голос
/ 13 августа 2010

Как видно из заголовка, я унаследовал приложение php / MySQL, которое имеет довольно хорошо написанный процедурный код, но имеет только один логин администратора. Клиент, естественно, хочет разделить функциональность на разных пользователей / ролей и в конечном итоге обновить код приложения с помощью передовых методов.

В качестве примера обновления чьего-либо имени пользователя в разделе администратора в исходной версии просто отображается текстовое поле, предварительно заполненное именем пользователя (код для краткости упрощен):

<input type="text" name="username" value="<?= $username; ?>">

Затем проверяется POST по регулярному выражению и сохраняется в базе данных.

Меня попросили посмотреть, как изменить существующий код, чтобы он мог работать с различными пользовательскими "ролями", и довольно удачно смоделировали пример приложения с таблицами, такими как user, role, permission user-role и role-permission, чтобы объяснить, как это будет работать на практике. Мне просто интересно, есть ли у кого-нибудь из вас советы о том, как записать разрешения в кодовую базу? Разумно ли просто обернуть существующий код либо в шаблон, либо в функцию в нечто вроде:

// $access_type can be the result of a function call, an array value, etc.
switch($access_type){
    case 'edit':
        echo '<input type="text" name="username" value="' . $username . '">';
        break;
    case 'readonly':
        echo $username;
        break;
    case NULL:
    default:
        // Don't display anything.
}

Мой вопрос: насколько хорошо это масштабируется с большими кусками кода? Есть пара «интерактивных функций», которые используют довольно много HTML и JavaScript, чтобы POST вернуть несколько значений одновременно. У нас была бы отдельная версия этого пользовательского элемента управления для каждой роли. Приклеивание каждой версии к switch немного пахнет (встроенный код или включается в отдельный файл) ... Аналогичным образом, в серверной части сценарий для обработки POST будет иметь несколько версий в зависимости от роли.

Я знаю, что должно быть сто способов сделать это, но что другие люди делали в прошлом? Если у вас есть какое-то понимание, не могли бы вы продемонстрировать это в процедурном стиле, так как в этом проекте нет ОО! Спасибо!

1 Ответ

1 голос
/ 13 августа 2010

Вы можете использовать что-то вроде:

interface User {
    /* stores several roles */
    /**
     * Combines the permissions of the several roles
     * of the user and returns the result.
     * @return Permission */
    function getPermission($key);
}
interface Role {
    /* stores several permissions */
    /* if there's no record of this kind of this
     * particular permission, return an empty one */
    /** @return Permission */
    function getPermission($key);
}
interface Permission {
    /** @return Permission */
    function combine(array $permissions);
    /** @return bool */
    function canEdit();
    function canRead();
}

, а затем просто выполните:

/* user factory takes care of creating the instances and
 * wiring them together */
$u = UserFactory::loadCurrentUser();
if ($u->getPermission('admin_page')->canWrite()) {
    //...
}
...