2

我需要被指出正确的方向。我正在编写一个简单的应用程序,用户可以在其中登录并查看他们的任务列表。我希望应用程序安全。我只能对用户进行身份验证以访问整个站点。显然这不是我想要的。我希望他们只能访问自己的帐户。有什么好的网站可以阅读这个吗?我正在学习 v2.x 。谢谢

4

3 回答 3

1

除了这本书,我想不出任何网站。这就是我实施我的方式。我在应用控制器的 beforeRender 回调中设置了登录用户。这样它就可以在所有控制器中使用。

然后我在用户控制器中有一个名为仪表板的功能

function dashboard($userId = NULL) {}

如果用户 ID 与登录用户中的用户 ID 匹配,或者在我的情况下,用户是管理员,则继续,否则重定向用户并显示不允许他们使用的消息。

所有这一切都是在您仅使用 Auth 组件的情况下发生的。如果您也想使用 ACL 组件,则必须检查用户是否也被允许访问该页面。

来源 http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html

于 2012-07-09T12:04:59.500 回答
0

你的问题很笼统,但这里有一些信息可能会有所帮助。

关于列出和查看数据,您可以访问已登录的用户 ID。因此,在整个应用程序中,在所有方法中,只需获取与登录用户 ID 相关的数据。

关于编辑/删除数据,您可能需要将登录用户的 ID 与他们尝试编辑或删除的记录的 ID 进行核对。

这是我挖出的一些旧的 CakePHP 1.3(即不是 2.x)代码。此方法在我的 AppController 中,当用户尝试编辑/删除记录时调用,以确保该记录属于他们的用户帐户。

function checkUserID($pUserId) {
    // This is called for methods when a user can only access it for their own user account - eg, a user can call 'edit', but only on their own records.    
    if ($pUserId != $this->Auth->user('id')){
        $this->Session->setFlash(__('You are not authorized to access that location', true));
        $this->redirect($this->referer());
    }
}

举例说明如何使用此方法,当用户尝试删除该应用程序中的评论时,我执行以下操作:

$commentToDelete = $this->Comment->read(null, $id); // get the comment they are trying to delete
$this->checkUserID($commentToDelete['Comment']['user_id']); // check that it is their own comment
// If they pass the above test, then continue and delete the comment.
// If not, they will have already been redirected by the checkUserID method

如果您有任何问题,请告诉我。

编辑:回应尼克的评论如下:

我以前使用过 isAuthorized() ,但在我上面给出的示例中看不到它是如何工作的。如果用户删除评论,您必须这样做:

$this->checkUserID($commentToDelete['Comment']['user_id']); // check that it is their own comment

但如果他们要删除一个小部件,它必须是:

$this->checkUserID($widgetToDelete['Widget']['user_id']); // check that it is their own widget

情况可能会更复杂,例如,他们正在编辑属于“图库”记录的“照片”记录,该记录包含他们的 user_id,因此“照片”记录本身没有“用户 ID”字段.

我看不出你如何能够在 isAuthorized() 中优雅地处理这些可能的情况。我错过了什么吗?我想问题是,在 isAuthorized() 中,您可以获取登录用户的 ID,但是您如何知道将其与哪个其他 ID 进行比较,以确保他们正在编辑或删除的记录属于他们?

于 2012-07-08T23:57:22.930 回答
0

我不能 100% 确定您要问什么,但据我了解,您需要您的用户能够访问某种仅与他们的帐户相关的控制面板或界面。为了实现这一目标,我将采取以下措施:

  • 在控制器中设置一个不带参数的函数
  • 检查以确保用户已登录
  • 如果他们在使用用户的 id 字段作为条件时将您需要的数据设置到视图中。使用此方法,用户无法指定他们尝试访问的数据,这取决于控制器和模型中的逻辑
  • 如果不是,则将它们重定向到其他地方

如果您编辑您的问题并提供有关您要完成的工作的更多信息,我可以给您一个示例或进一步解释。

于 2012-07-09T06:19:10.947 回答