针对不同类型用户的单一登录页面

时间:2017-06-22 13:15:28

标签: php mysql

我正在开发一个应用程序,允许用户注册为类别1 类别2 或两者。简而言之,用户可以在类别1下注册,也可以使用相同的详细信息在类别2下注册。

考虑到这一点,我已经想到了在我的数据库中存储用户详细信息的一些方法:

  1. 使用单个表格,我将使用角色或权限区分类别。
  2. 使用两个表格,我会根据用户的选择(在注册时)在各自的表格中存储用户。
  3. 在考虑以下事项之后:

    • 用户可以选择在两个类别中注册,
    • 用户可以决定对两个类别使用相同的详细信息;

    我得出一个结论,我的选择不会给我我想要的东西。

    现在,在我的代码中,我创建了我的User类,我用它进行注册并登录用户。

    class User {
        private $_db,
                $_data,
                $_sessionName,
                $_isLoggedIn;
    
        public function __construct($user = null) {
            $this->_db = DB::getInstance();
    
            $this->_sessionName = Config::get('session/session_name');
    
            if(!$user) {
                if( Session::exists($this->_sessionName) ) {
                    $user = Session::get($this->_sessionName);
    
                    if( $this->find($user) ){
    
                        $this->_isLogggedIn = true;
    
                    } else {
    
                        $this->logout();
    
                    }
                }
            } else {
    
                $this->find($user);
    
            }
        }
    
        public function find($user = null) {
            if($user) {
                $field = (is_numeric($user)) ? 'id' : 'email';
    
                if ( $packageType == 'category1' ) {
                    $fCheck = $this->_db->get('table_name', array($field, '=', $user));
    
                    if( $fCheck->count() ) {
                        $this->_data = $fCheck->first();
                        return true;
                    }
                }
                elseif ( $packageType == 'category2' ) {
                    $iCheck = $this->_db->get('table_name', array($field, '=', $user));
    
                    if($iCheck->count()) {
                        $this->_data = $iCheck->first();
                        return true;
                    }
                }
            }
            return false;
        }
    
        public function login($userInput = null, $password = null) {
            $user = $this->find($userInput);
    
            if($user) {
                if(password_verify($password, $this->data()->password)) {
                    Session::put($this->_sessionName, $this->data()->id);
                    return true;
                }
    
            }
    
            return false;
        }
    
        public function logout() {
            Session::delete($this->_sessionName);
        }
    
        public function data() {
            return $this->_data;
        }
    
        public function isLoggedIn() {
            return $this->_isLogggedIn;
        }
    }
    

    在使用单个表时,代码无需在我的$packageType方法中定义或检查find(),但正如我所指出的,我需要将它用于不同的表。

    我现在所困扰的是如何使用User类检查用户登录的特定包,并获取相应的用户详细信息,那张特别的桌子。

    任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

TL; DR:制定一个解决方案,使用您可用的两个选项来更好地组织系统信息。

使用数据库的方式(仅限两个表),您必须在两个表上找到用户。这意味着您首先搜索其中一个,如果您找不到该用户,请搜索另一个用户。这意味着您必须找出一个优先级系统,其中表将优先于另一个。

然而,正如你之前所说:

  

我得出一个结论,我的选择不会给我我想要的东西。

它实际上无法完全解决您的问题,因为您需要用户使用单个用户名登录并且可以访问这两个类别。

所以,由于第一个选项只能解决你问题的一半,所以让我们检查另一个问题 选项2为用户使用一个表。这很好,因为这意味着每个用户都有一个用户名。但是,你的要求需要两个表(也许category1有类别2没有,反之亦然?),所以这不合适。

由于选项1是解决方案的一半而选项2是另一半,所以让我们使用两者!

您的数据库现在将有三个表:category1的表,category2的表和用户的表。您的类别表将包含特定于您的类别的用户信息,您的用户表将包含每个用户的用户名和密码信息 您的类别表不会有主键,只有外键(引用用户表的PK)。登录时,您的系统必须询问用户想要登录的类别。选择类别后,您可以根据用户选择的类别搜索category1或category2上的用户信息。

那就是它!您现在拥有一个登录系统,支持多个具有多个权限级别和用户信息的用户。