草庐IT

php - 处理admin系统用户和前端网站用户时如何处理用户权限?

coder 2024-04-06 原文

任何人都可以推荐一个信息来源或工作示例,显示在同时处理管理系统用户和网站用户时如何处理访问权限?

我们目前的代码有点像网上商店的大版本,有几名员工使用管理系统管理订单,并且有任意数量的客户使用该网站。管理系统是围绕访问控制列表(如 LiveUser)构建的,但有一个相当大的“创可贴”与一个“虚拟”用户一起担任所有网站用户(所有客户)的角色。

理想情况下,应用程序代码将使用诸如 can_place_order() 之类的短语。以确定用户是否可以执行任务。只要库存水平至少与订单数量一样多,并且客户已经支付了订单值(value),客户就可以下订单。只要管理员用户具有“customer_services”角色,他们就可以下订单。

理想情况下,我们希望扩展系统,以便我们可以让某些注册客户在没有足够库存或付款的情况下下订单,只需生成发票和延期交货即可。除了许多员工“角色”之外,这将是至少两个客户“角色”......

  • 如何对两个单独的用户列表使用相同的权限系统?
  • 或者,如何将明显的两组用户合并到一个列表中?

  • 我们在应用程序中使用 php 和 MySQL,但欢迎使用任何其他语言模式。

    最佳答案

    我已经尝试了很多不同的权限方案,但我只找到了一种方法来使它们工作,几乎在所有情况下都能满足程序员和客户的需求。这是为了使它们部分地由数据驱动。

    我最近的尝试是这样工作的:

  • 每个用户都附加了一个权限对象。在我的情况下,在请求用户时自动创建。 (在我的情况下,不同部分的权限可能不同。因此,可能允许用户对 Y 执行 X 而不能对 Z 执行。)
  • 每个需要许可的页面、代码块或 View 都用检查权限对象的 if 语句包装。如果该权限也需要担心该部分,则当前相关的部分 ID 作为数组传入,返回一个新的 bool 数组以进行匹配。
  • 然后该界面不会直接向用户公开这种复杂的困惑,而是一个 super 管理界面允许创建新的用户类型。这些类型带有将为该“类型”用户启用的权限集。不同类型的权限可能存在重叠,因此管理员和编辑器都可以“编辑副本”或其他任何内容。
  • 普通的管理界面允许将单个用户设置为不同部分的不同用户类型。因此,一个用户可能是第 2 部分的管理员,以及第 2、3、4 和 5 部分的编辑者。它们也可以全局设置,从而重载未使用的部分 (0)。

  • 这有很多好处和一个缺点。第一,缺点。由于这些 key 直接嵌入到代码中,因此只有 super 管理员(又名开发人员)才能访问该部分界面。实际上,可能根本不需要接口(interface),因为权限列表应该只随代码而变化。这里真正的问题是,在运行代码之前,您不会知道标题有什么问题,因为语法会很好。现在,如果这是用 C# 之类的代码编写的,这将是一个非常严重的问题。但是几乎 PHP 中的所有内容都不是类型安全的,因此它实际上只是类(class)的标准。这些值也可以从配置文件加载,甚至可以嵌入到您构建用户类型的 GUI 中,尽管这似乎是错误的。

    您从中获得的是即时设置新权限类型的能力。您可以相对轻松地重命名这些权限。 (由于系统只使用数字,因此标题仅用于捕获数字,因此可以在少数地方轻松更改。)并且代码使用起来非常简单。它看起来像这样:
    if($current_user->permissions->can("View Sales Records"))
    {
        //Code to view sales records
    }
    

    或者稍微复杂一点
    $sections = array(1,2,3,4); //Probably really a list of all sections in the system
    $section_permissions = $current_user->permissions->these($sections)->can("Edit Section");
    foreach($sections as $s)
    {
        if($section_permissions[$s])
        {
            // Code for maybe displaying a list of sections to edit or something
        }
    }
    

    方法链也很简单。 ->these()将内部数组设置为这些值,然后返回对对象本身的引用。 ->can()如果该列表存在,则对该列表进行操作,然后将其取消设置。在我自己的版本中,我也有 ->any()它总是返回一个完整的部分列表,所以我可以检查 ->any()->can() .

    最后,权限对象还包含用户类型的列表。这使得显示用户列表及其事件权限变得非常容易。就我而言,我们只使用 ->types()访问该列表 ids => names 的数组.

    不存在的权限标题会被简单地忽略。它们也以小写形式匹配,并删除了空格和特殊字符,以帮助减少打字错误的问题。我什至考虑过进行 levenshtein 距离检查并选择最接近的匹配项。但最终最好不要依赖这样的东西。 (可能会记录错误,但请优雅地选择最接近的匹配项。)

    在代码之外和界面中,用户只需要在 Admin、Editor、Publisher、Writer 和 CEO 等等中相互关联。为不同的组织创建不同的用户类型集也很简单。

    这的所有部分都可以被大量缓存,为根本没有登录的人设置一个基本用户非常容易,而且我还没有遇到基于权限的问题,使用这个解决方案并不明显结构体。

    我只希望我能与你分享实际的代码。我只是自己不拥有它,因此无法发布它。

    关于php - 处理admin系统用户和前端网站用户时如何处理用户权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7497296/

    有关php - 处理admin系统用户和前端网站用户时如何处理用户权限?的更多相关文章

    1. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    2. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

      我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

    3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

      我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

    4. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

      我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

    5. ruby - Ping ruby 网站? - 2

      在Ruby中可以使用哪些替代方法来ping一个ip地址?标准库“ping”库的功能似乎非常有限。我对在这里滚动我自己的代码不感兴趣。有没有好的gem?我应该接受它并忍受它吗?(我在Linux上使用Ruby1.8.6编写代码) 最佳答案 net-ping值得一看。它允许TCPping(如标准ruby​​ping),但也允许UDP、HTTP和ICMPping。ICMPping需要root权限,但其他则不需要。 关于ruby-Pingruby网站?,我们在StackOverflow上找到一个类

    6. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

      我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

    7. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

      我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

    8. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

        电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

    9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

      在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

    10. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

      需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

    随机推荐