CodeIgniter 实现登录登出控制
Cemon_Liu Lv4

CodeIgniter设计验证登录

需求为在登录时验证账户是邮箱地址还是账户名,同时验证账户密码长度以及是否存在资料库中。

1. 登录界面设计

从DeskApp里面直接复制对应的html代码即可,同时需要注意这个在于将HTML进行切割成不同的layout 部分。这样方便后面的复用。针对页首页脚侧边栏等采用<?= include('inc/footer.php'); ?>)方式来引用。 而对于要传入的内容则使用 <?= $this->renderSection('content'); ?> ,在具体的页面里使用extend扩展其他页面,而section则传入相应的值。

1
2
3
4
<?= $this->extend('backend/layout/auth-layout')?>
<?= $this->section('content'); ?>
Auth page content here .........
<?= $this->endSection();?>

2. 控制器设置

在admin group下面增加login的get 和Post方法的控制器。分别用于打开login界面和提交登录系统。

  • $routes->view()可以直接展示view界面,而不用控制器中转。
  • 使用['as'=>'admin.handler']可以设置别名,方便在view界面进行控制,使用范例<form action="<?= route_to('admin.login.handler') ?> " method="POST">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$routes->group('admin',static function($routes){

$routes->group('',[],static function($routes){

$routes->get('home','AdminController::index',['as'=>'admin.home']);
$routes->get('logout','AdminController::logoutHandler',['as'=>'admin.logout']);

});
$routes->group('',[],static function($routes){
// $routes->view('example-auth','example-auth');
$routes->get('login','AuthController::loginForm',['as'=>'admin.login.form']);
$routes->post('login','AuthController::loginHandler',['as'=>'admin.login.handler']);

});
});

3. Validation

是用$this->validate()方法去验证log_id 。rules为验证的规则,一般采用系统默认的一些规则。其中要注意的是is_not_unique,这个方法的参数是table.column,可以直接去数据库进行查询是否存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public function loginHandler()
{
$fieldType = filter_var($this->request->getVar('login_id'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
if ($fieldType == 'email') {
//is_not_unique[table.column]是直接验证字段在表内的存在
$isValid = $this->validate([
'login_id' => [
'rules' => 'required|valid_email|is_not_unique[users.email]',
'errors' => [
'required' => 'Email is required',
'valid_email' => 'Email is not valid',
'is_not_unique' => 'Email is not exists in our system.'
]
],
'password' => [
'rules' => 'required|min_length[5]|max_length[45]',
'errors' => [
'required' => 'password is required',
'min_length' => 'min_length is 5',
'max_length' => 'max_length is 45.'
]
]
]);
} else {
$isValid = $this->validate([
'login_id' => [
'rules' => 'required|is_not_unique[users.username]',
'errors' => [
'required' => 'username is required',
'is_not_unique' => 'username is not exists in our system.'
]
],
'password' => [
'rules' => 'required|min_length[5]|max_length[45]',
'errors' => [
'required' => 'password is required',
'min_length' => 'min_length is 5',
'max_length' => 'max_length is 45.'
]
]
]);
}

4. 界面传参

在示例文件中,将view界面创建了一个validation实例。<?php $validation = \Config\Services::validation(); ?> 。而将控制器里面的实例$this->validator()传给了view界面的$validation。使用geterror()获取对应的验证信息。

1
2
3
4
5
<?php if ($validation->getError('login_id')) : ?>
<div class="d-block text-danger" style="margin-top:-25px; margin-bottom:15px">
<?= $validation->getError('login_id'); ?>
</div>
<?php endif; ?>

CodeIgniter设计登出

直接调用function移除session里面的相关数据。

1
2
3
4
5
6
public static function forget()
{
$session = session();
$session->remove('logged_in');
$session->remove('userdata');
}
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量