CakePHP在登录时重定向,具体取决于用户名

时间:2011-07-18 18:10:46

标签: php cakephp redirect login

我有一个CakePHP 1.3应用程序,它有一个登录系统,运行良好。它使用带有用户表的数据库,该表在创建此应用程序之前就已存在。

我在 AppController 中使用验证。登录功能类似于

function login() {}

它位于 users_controller

正如我所说的,一切正常,但我在尝试添加新功能时遇到了问题。我想在登录过程中检测用户是否引入了登录/密码的特定组合(假设 admin / adminpwd )。如果是这样,登录应该是成功的,他将被带到管理区域(/ admin / index)。否则,登录过程应该照常工作。

一旦进入此管理区域(由 admin_controller 控制),此用户应该能够执行对他独有的某些操作,对其他用户执行no(甚至如果他们在浏览器上输入/ admin / 操作)。

我已经阅读过关于ACL的内容,可能它对此有所帮助,但对于我真正需要的内容来说似乎太复杂了。有没有简单的方法来做到这一点?我想我应该修改登录功能,但我真的不知道究竟是怎么回事,如果还有什么我应该改变......有什么想法吗?

2 个答案:

答案 0 :(得分:2)

是的,ACL非常复杂(而且功能强大)。但在您的情况下,我建议在用户表中创建一个“组”字段,以区分用户的角色。因此,如果您愿意,可以在以后拥有更多管理员。它比users_controller中的某个登录凭据的硬编码更灵活。

您需要做几件事:

  • 告知Auth组件在用户登录后将控制权转移给您,以便您可以确定其组并相应地重定向它们。

  • 检查组中的用户是否正在访问其他组的操作:如果不这样做,普通用户只需要登录,他们就可以输入admin url(如果他们知道的话)他们可以做管理员可以做的一切。此检查可能会在app_controller中的before_something_()中完成,也可以在某个地方点按Auth。

我不记得所有细节,但你可以在Cake Cookbook中获得所需的一切。祝你好运!

答案 1 :(得分:1)

让我们看一些代码......

class UsersController extends AppController {

    // we're moving the variable to AppController!

    public function login() {

        $usrInfo = $this->Auth->user();

        if (isset($usrInfo) {

            // this index name might not be right.  I'm going off memory please check this!
            if (in_array($usrInfo['username'], $this->adminUsers)) {
                // do your code here for admin users.  
                // could be a redirect or just changing the layout used
            } else {
                // is a user that is logged in but not in our admin list
            }

    }

}

要测试用户是否已登录,您需要执行以下操作:

class AppController extends Controller {

    protected $adminUsers = array('joe_blow_uname', 'jane_blow_uname');

    public function beforeFilter() {

        $routing = Configure::read('Routing.admin');
        $usrInfo = $this->Auth->user();

        if (isset($this->params[$routing]) && isset($usrInfo)) {
            if (!in_array($usrInfo['username'], $this->adminUsers)) {
                // do code here for non-admin users using /admin prefix
            }
        }

    }

}

如果这没有用,请告诉我。

或者更坏的事情......

编辑:

这显然不是最好的方法。 ACL或在数据库中设置某种组可能会更好。但是,对于小型网站来说,它是一种相对快速且非常脏的方式,应该可以正常工作。

相关问题