1

我有这样的codeigniter模型

<?php

class Model_Login extends CI_Model{
    function __construct(){
        parent::__construct();
    }

    public function login_submit($arrayData){
        extract($arrayData);
        $username=clean($txtusername);
        $password=clean($txtpassword);

        //first get salt for the respective user.
        $getsalt=$this->db->query("SELECT PASSWORD_SALT FROM USER_INFOS WHERE USER_NNAME=?",array($username))->row();
        $salt=$getsalt->PASSWORD_SALT;
        $password=sha1($salt.$password);

        $query=$this->db->query("SELECT * FROM USER_INFOS WHERE STATUS='Y' AND USER_NNAME=? AND USER_PASSWORD=?",array($username,$password));

        if($query->num_rows>0){
            $row=$query->row();
            // login successfull create session
            $this->session->set_userdata('USER_ID', $row->USER_ID);
            $this->session->set_userdata('USER_FULL_NAME', $row->USER_ENAME);

            return "success";
        }else{
            return "Invalid username and/or password.";
        }





    }
}

?>

其中,PASSWORD_SALT 是一个数据库字段,包含使用hash函数散列的 128 个字符长的随机(对于每个用户)盐。

USERNAME如果代码是唯一的,则代码可以完美运行。但我试图想到可能会要求用户名不应该是唯一的客户。如果用户名不是唯一的,则始终选择第一行,并且除了具有相同用户名的用户之外的所有用户都无法登录,即使他们提供了有效的用户名和密码。

在这种情况下有什么更好的解决方法?

编辑

我知道USERNAME不唯一是一个坏主意。但是在我们国家有几个网站的用户名不是唯一的(或者在某些情况下用户名甚至是可预测的)。例如,我在某个银行分行有一个帐户,其分行代码是032,我的名字是 John Smith,那么访问他们的电子银行的用户名将是032JOHNS,该分行中可能有多个 John Smith 最终具有相同的用户名。要登录他们的电子银行系统,我只需要提供这个用户名和我的密码。

谢谢

4

3 回答 3

1

如果你真的必须有非唯一的用户名,你可以用用户名遍历所有用户并检查每个用户的密码,即如果 3 ppl 有用户名 foobar,并且第一个密码检查失败,检查第二个等等。

(注意:我强烈建议不要这样做。如果用户名不能唯一,请使用电子邮件地址作为唯一标识符 / 用于登录)。

于 2012-11-01T06:05:44.190 回答
1

如果用户名不是唯一的,那么唯一标识用户的是什么?

它必须是用户在登录时提供的东西,并且不能是用户名和密码的组合,因为不能保证两个用户不会选择相同的密码。

因此,如果用户名不是唯一的,那么其他东西必须是唯一的(或与用户名组合是唯一的)。例如,如果他们通过自定义域进行某种多租户,那么它将是域。

但是您不能拥有非唯一的用户名并期望密码来确定正确的用户

(旁注,你可以,但你不应该——我碰巧能够使用相同的电子邮件地址登录两个不同的亚马逊账户,但密码不同。我想知道如果我更改一个密码以匹配另一个密码会发生什么,但我太看重我的帐户,无法尝试。)

于 2012-11-01T06:06:16.150 回答
1

而不是这个:

$getsalt=$this->db->query("SELECT PASSWORD_SALT FROM USER_INFOS WHERE USER_NNAME=?",array($username))->row();
        $salt=$getsalt->PASSWORD_SALT;
        $password=sha1($salt.$password);

        $query=$this->db->query("SELECT * FROM USER_INFOS WHERE STATUS='Y' AND USER_NNAME=? AND USER_PASSWORD=?",array($username,$password));

使用这样的东西:

$query=$this->db->query("SELECT * FROM USER_INFOS WHERE STATUS='Y' AND USER_NNAME=? AND USER_PASSWORD=SHA1(CONCAT(PASSWORD_SALT,?))",array($username,$password));
于 2012-11-01T06:09:51.253 回答