如何在CodeIgniter中实现POS系统VOID按钮的登录验证模态框
适配原生PHP验证逻辑到CodeIgniter的解决方案
1. 修正文件结构(核心问题)
CodeIgniter遵循MVC架构,view目录仅用于存放视图模板,不能放置业务逻辑文件(如你的action.php)。首先要将验证逻辑迁移到Controller中:
- 在
application/controllers/下创建或修改Order.php控制器(已有订单相关控制器可直接复用)。
2. 实现Controller中的验证方法
在Order.php中添加处理VOID权限验证的方法,示例代码如下:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Order extends CI_Controller { public function __construct() { parent::__construct(); // 加载用户模型(用于查询用户、权限) $this->load->model('User_model'); // 加载CI表单验证库(可选,用于快速校验必填字段) $this->load->library('form_validation'); } // 处理VOID按钮的权限验证请求 public function void_auth() { // 仅接受AJAX POST请求 if (!$this->input->is_ajax_request() || $this->input->method() !== 'post') { $this->output->set_content_type('application/json')->set_output(json_encode([ 'status' => 'error', 'msg' => '非法请求' ])); return; } // 校验必填字段 $this->form_validation->set_rules('username', '用户名', 'required'); $this->form_validation->set_rules('password', '密码', 'required'); if ($this->form_validation->run() === FALSE) { $this->output->set_content_type('application/json')->set_output(json_encode([ 'status' => 'error', 'msg' => validation_errors() ])); return; } // 获取前端提交的参数 $username = $this->input->post('username'); $password = $this->input->post('password'); // 验证用户名密码 $user = $this->User_model->get_user_by_username($username); if (!$user || !password_verify($password, $user->password)) { $this->output->set_content_type('application/json')->set_output(json_encode([ 'status' => 'error', 'msg' => '用户名或密码错误' ])); return; } // 验证用户是否具备商品作废权限 if (!$this->User_model->has_void_permission($user->id)) { $this->output->set_content_type('application/json')->set_output(json_encode([ 'status' => 'error', 'msg' => '无商品作废权限' ])); return; } // 验证通过,返回成功响应 $this->output->set_content_type('application/json')->set_output(json_encode([ 'status' => 'success', 'msg' => '验证通过' ])); } }
3. 编写User模型(处理数据查询)
在application/models/下创建User_model.php,实现用户和权限的查询逻辑:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class User_model extends CI_Model { // 根据用户名查询用户信息 public function get_user_by_username($username) { return $this->db->get_where('users', ['username' => $username])->row(); } // 验证用户是否有商品作废权限 public function has_void_permission($user_id) { // 示例:假设权限表为user_permissions,关联user_id和permission字段 $count = $this->db->where('user_id', $user_id) ->where('permission', 'void_product') ->count_all_results('user_permissions'); return $count > 0; } }
4. 调整前端AJAX请求地址
将原来指向application/view/order/action.php的请求地址,修改为CodeIgniter的路由地址:
// 替换原AJAX请求地址 $.post('<?php echo base_url('order/void_auth'); ?>', { username: $('#username').val(), password: $('#password').val(), // 若开启CSRF防护,必须携带CSRF Token <?php echo $this->security->get_csrf_token_name(); ?>: '<?php echo $this->security->get_csrf_hash(); ?>' }, function(response) { // 保留你原有的前端响应处理逻辑 if (response.status === 'success') { // 执行商品作废操作 } else { alert(response.msg); } }, 'json');
5. 关键注意事项
- CSRF防护:CodeIgniter默认开启CSRF防护,AJAX请求必须携带CSRF Token,否则会被拦截。
- 路由配置:确保
application/config/routes.php中没有自定义路由覆盖order/void_auth的访问路径,默认CI会自动映射控制器名/方法名的路由。 - 密码安全:用户密码必须用
password_hash()加密存储,验证时用password_verify()比对,禁止明文存储或校验。
内容的提问来源于stack exchange,提问作者wloleo
相关产品推荐
相关产品推荐

