如何根据数据库中的受控列表值正确管理 Web 应用程序行为?

How to properly manage web app behavior based on controlled list values from database?

我不确定这里是否适合问这个问题,所以请告知是否应该移动它。

我正在开发基于Laravel的Web应用程序,其主要目的是为特定的MariaDB关系数据库提供接口,我没有自己设计或开发。

此数据库包含许多所谓的 'controlled lists' 词汇术语,形式为 tables,带有自动递增字段和包含术语的字符串字段。

其中一个 table 用于控制在数据库中创建或编辑记录时设置的可能状态。可供选择的条款(在 HTML 形式中带有 <select>)包括 draftcomplete 等。从 table.

检索

问题如下:

该应用有一个基本的用户角色系统,因为不同类型的用户应该有不同的权限。

其中一个角色是 reader,它只允许搜索和查看现有记录,而不能编辑任何内容。但是,此用户角色应该不能查看状态为草稿的记录。

我目前的管理方式有点像这样:

if (Auth::user()->is_reader && $record->status === 1) {
    abort(403,'Not enough privileges to view this record.');
}

它基本上使用状态列表 table 中 草稿 值的 ID 来检查记录的状态并采取相应的行动。我也在使用类似的系统从搜索结果中排除草稿记录。

我不喜欢这个,因为它依赖于数据库中的特定 ID 值,尽管无法从 Web 界面更改此特定 table(状态列表)中的值,实际值仍然可以改变(或不改变?)。

我考虑过首先对 table 进行查询以获取术语 LIKE %draft% 所在的 ID,但是 - 尽管可能更合适 - 我想我仍然会依赖出于某种原因可能会在未来发生变化的事情(术语 草案 )。另外,我怀疑它会对性能产生一些影响,但可能不会太大。

解决这个问题的更好方法是什么?也许不要为这个特定的术语列表使用数据库并将它们放在配置文件中?

感谢您的帮助。

您可以创建一个带有一些常量的抽象 class,然后使用该常量来引用所需的值。

类似于:

abstract class RecordStatus {
  // Some random names
  const STATUS_READABLE = 1;
  const STATUS_WRITABLE = 2;
}

然后需要用到的时候:

if (Auth::user()->is_reader && $record->status === RecordStatus::STATUS_READABLE) {
    abort(403,'Not enough privileges to view this record.');
}

这样你有:

  • IDE 自动完成和检查
  • 您可以轻松更改该值(es.readable 应该是 3 而不是 1?只需在摘要中更改即可 class)