CakePHP:如何在每个控制器中的模型中使用函数?

时间:2019-06-24 22:48:03

标签: php cakephp cakephp-3.0 shibboleth

我有一个包含 admin user 部分的项目。两个部分都使用相同的控制器,只是功能和模板不同(例如:viewAdmin()viewUser())。在每个控制器的功能beforeRender()中,我将变量$admin设置为true用于管理功能,将false设置为用户功能。

对于身份验证,我使用 Shibboleth 。 Shibboleth使用来自LDAP的数据,而用户类型保存在SQL数据库中,这意味着虽然它可以检查登录名和密码是否为false,但不能检查用户是否为admin。用户只要使用正确的action(例如:转到链接http://example.com/tool/viewAdmin),就可以进入ADMIN部分。

为防止这种情况,我将必须:

  1. 加载模型Users
  2. 将环境变量uid(登录名)与我的SQL数据库中Users表中的“登录”列进行比较
  3. 请参阅Users表中的“类型”列以了解用户是否为管理员。
  4. 将结果与$admin的值进行比较,并在必要时重定向到错误页面。

问题是:我不想为每个控制器重复这些步骤。

目前我有两个想法:

  1. UsersController中编写一个函数,并在每个控制器中使用它。
  2. 创建一个组件并将其加载到每个控制器中。

这两种方法都要求我更改所有控制器中的代码。我想通过减少app.phpbootstrap.php来减少工作量,找到更好的方法。

任何建议都值得赞赏。

2 个答案:

答案 0 :(得分:0)

要在CakePHP控制器中共享方法,您可以执行以下操作:

  1. 创建组件并将其包含在控制器中
  2. 或在AppController中创建方法并在子控制器中使用
  3. 或通过PHP方式创建特征。

但是,当您授权用户时,所有用户数据都存储在会话中,包括。是用户角色(例如admin,regular,member等)。

答案 1 :(得分:0)

使用官方的CakePHP身份验证插件,并使用所需的其他代码来扩展LDAP适配器。这很容易做到,也是解决问题的一种非常干净的方法。免责声明:我是身份验证插件的作者之一。 https://github.com/cakephp/authentication

或者,如果您想不了解任何框架,请使用我的基于身份验证插件的库,该库已与任何框架分离,但仍然可以与Cake https://github.com/Phauthentic/authentication很好地兼容。