项目登陆功能的总体架设

来源:互联网 发布:maven 打包 java 工程 编辑:程序博客网 时间:2024/06/03 22:59

登陆功能是项目中最基本的功能,说简单也简单,可是也不是那么简单,还是架构问题吧!

登陆是一个项目的入口,是基础,我们应该怎么架构这个问题,下面看看我的方法:

1.毫无疑问,是我们的登陆的控制器

public function doLogin() {        // 验证令牌        $this->checkFormToken();        // 密码登录        /** @var AuthService $auth_service */        $auth_service = D('Auth', 'Service');        list($code, $message, $manager) = $auth_service->doLoginPassword(I('username'), I('password'));        if ( $code < 0 ) {            return $this->ajaxResponseToken($code, $message);        }        $manager_model = D('Manager');        $info = array('last_login_ip' => get_client_ip(), 'last_login_time' => datetime(), 'relogin' => 0);        $manager_model->updateManagerById($manager['manager_id'], $info);        // 设置会话数据        session('manager', $manager);        session('manager_id', $manager['manager_id']);        session('menu_list', NULL);        $this->ajaxResponse(0, '登录成功!');    }

2.涉及到我们登陆的服务层

public function doLoginPassword($username, $password) {        if ( empty($username) ) {            return array(-1, '请输入账号!', []);        }        if ( empty($password) ) {            return array(-2, '密码不能为空!', []);        }        $login_log_model = D('LoginLog');        $fail_count = $login_log_model->getLoginFailNum($username, day());        if ( $fail_count >= C('MAX_LOGIN_FAIL_NUMBER') ) {            return array(-1, "您今日已经达到错误登陆的次数上限,每天最多 ".C('MAX_LOGIN_FAIL_NUMBER')." 次", []);        }        $manager_model = D('Manager');        $manager = $manager_model->getManagerByUsername($username);        if ( empty($manager) ) {            return array(-1, '账号不存在!', []);        }        $log = array('username' => $username, 'password' => $password, 'ip' => get_client_ip(),                     'ctime' => datetime());        if ( !password_verify($password, $manager['password']) ) {            $log['result'] = 'fail';            $log['message'] = '密码不正确';            $login_log_model->addManagerLoginLog($log); // 添加登录日志            // TODO 用户当日输入密码错误超过一定次数则冻结账号            return array(-2, $log['message'], []);        }        // IP地址检查        if ( !empty($manager['allow_ip'])            && !$this->isIpAllow(get_client_ip(), $manager['allow_ip']) ) {            $log['result'] = 'fail';            $log['message'] = 'IP地址被限制登录';            $login_log_model->addManagerLoginLog($log);            return array(-1, $log['message'], []);        }        // 添加登录日志        $log['result'] = 'success';        $log['message'] = '登录成功';        $login_log_model->addManagerLoginLog($log);        // 账号未激活算登录成功        if ( $manager['active'] != 'Y' ) {            return array(-1, '账号未激活!', []);        }        return array(0, '登录成功!', $manager);    }

3.在服务层我们还需要一个功能就是确定当前用户的错误登陆次数,(这个我是在model控制)

 public function getLoginFailNum($username, $day = NULL) {        if ( empty($day) ) $day = day();        return $this->__log_model->field("id")            ->where("username='%s' AND result='fail' AND ctime >= '%s' AND ctime <= '%s'", $username, $day.' 00:00:00', $day.' 23:59:59')            ->count();    }



原创粉丝点击