多个认证系统

时间:2012-03-09 08:07:53

标签: php cakephp authentication

我有2个表,UsersCustomers以及2个不同的操作。所以我需要2个身份验证系统。用户使用用户名和密码登录,客户使用和id和密码登录。

我知道蛋糕默认AuthComponent只能处理1个模型,User模型。因为'userModel'可以是字符串而不是数组(不是吗?)。

如何在2个模型(和表格)中使用2个登录页面和2个....

(注意:我无法合并2个表。它们有不同的模式)

4 个答案:

答案 0 :(得分:1)

我强烈建议您研究ACL和ARO,而不是尝试维护2个不同的Auth系统。这将允许您将用户与不同的访问组相关联 - 在您的情况下,您可以拥有“内部” 1 和“Customers”等组,并且每个新用户帐户都是一个组或另一个组的成员。

然后,您可以在组级别授予权限。客户用户可以访问他们的内容,内部用户可以访问不同的内容。

新的CakePHP书中有一个很好的教程:Simple Acl controlled Application

1 我假设当你提到“用户”时,你的意思是内部用户,但可以随意根据你的具体情况调整术语和组名。

答案 1 :(得分:0)

我会假设2个单独的登录区域或单选按钮来建议他们正在尝试登录。

使用该表作为哪个表进行身份验证,然后您的代码应遵循相同的路径。

if (customer) {
 do customer stuff;
} elseif (user) {
 do user stuff;
} else {
 you didn't login;
}

答案 2 :(得分:0)

当您为他们创建注册表单时,尝试将他们的数据放入不同的数据库中。这样你就可以区别对待它们了。为此,请检查提交按钮ID并将数据定向到适当的表。将put id作为自动增量插入时。

答案 3 :(得分:0)

我建议不要在这种情况下歧视用户和客户。可以使用角色解决这些问题。在开始设计之前,请阅读Authentication, Authorization and AuditRole-Based Access Control

根据我的理解,这是对身份验证过程的概述(请注意,我不是安全专家):

识别阶段涉及获取用户凭证。一个简单的表单,可以检索用户的名称和密码就足够了。

身份验证阶段表示将用户凭据映射到用户的过程。基本上,它标识身份提供者并使用它来获取所提供的用户凭证的用户ID。

与服务类似,它们看起来像这样:

// You can have many IdentityProviders. This mecanism allows you to extend your
// authentication system so you can use any mechanism (WebDav, Kerberos, etc).
IIdentityProvider
{
    // Returns a pozitive id if the user is found and the credentials are valid
    // or zero if user credentials are invalid (or negative numbers that represent
    // error codes).
    UserID GetUser(UserCredentials)
}

IAuthenticationService
{
    Session SignIn(UserCredentials)
    void SignOut(Session)
}

DefaultIdentityProvider : IIdentityProvider
{
    // Search the user in your database.
    UserID GetUser(UserCredentials credentials)
}

AuthenticationService : IAuthenticationService
{
    IIdentityProvider[] identityProviders

    Session SignIn(UserCredentials credentials)
    {
        IIdentityProvider provider = identityProviders[credentials.Type]
        Session session = null

        if (provider)
        {
            UserID userID = provider.GetUser(credentials)

            if (userID > 0)
            {
                session = new Session
                session.UserID = userID
            }
        }

        return session
    }

    void SignOut(Session session)
    {
        delete session
    }
}

自动化系统说明用户可以使用资源做什么。资源可以是应用程序管理的任何实体。他们有类型 ID 。可选地,它们可以是一个或多个类别的一部分。用户可以在资源上执行某些操作,具体取决于其类型和类别。这是由权限定义的。权限分组在角色中。您可以为用户分配零个或多个角色。

在您的示例中,客户是一个角色。资源例如是产品。产品由产品类型表示,它具有ID并且可以具有关联的一些类别(“电子”和“危险”)。可以将操作视为创建/读取/更新/删除动词的变体。现在,Customer角色将包含一组权限,这些权限明确说明具有此角色的用户可以对托管资源执行的操作。例如,客户只能阅读有关产品的某些信息,但不能创建,更新或删除产品。请注意,如果用户关联了多个角色,则会获得该角色的所有权限(联合操作,而不是交集)。

这只会划伤表面。为了进一步阅读,您可以在互联网上找到更多可以更好地解释这些概念的文章。这是为了指出你正确的方向。