auth 权限控制
2015-06-25 20:16
393 查看
一. 权限介绍
所谓权限控制,大部分是在管理后台上使用。比如超级管理员登录,会得到所有操作的
控制权;认证专员,只能给会员做认证操作;审核专员,只能操作内容的审核、删除、加精
等操作,以此类推。那么 ThinkPHP 提供了一个内置的 Auth.class.php 类来实现权限控
制,这个类提供了三个表:think_auth_rule(认证规则表)、think_auth_group(用户组
表)、think_auth_group_access(用户和组对应关系表)。当然还要结合自己创建的用户
表进行对应即可
二. 简单登录
第一步:在 Admin 模块下创建一个 IndexController.class.php (默认就有了),创
建 index 方法,输出一句话即可。
这是通过 URL 访问: http://localhost/demo39/Admin/Index/index ,即可访问。
第二步:在 Weibo 根目录下的 Common 公共模块下创建 Controller 文件夹,并在里面
创建一个 AuthController.class.php 类,这个类用于权限控制。
这里使用的方法固定为: _initialize() 。由于 AuthController.class.php 继承了
Controller 类,所以,第一步的 Index 类改为继承它。 check() 函数是调用了
ThinkPHP/Library/Think/Auth.class.php 内部的 check() 函数。
此时,我们再访问后台首页的时候,已经没有权限了。主要是 $auth->check() 验证无
法通过的原因。
第三步:创建一个 WeiBo/Admin/Controller/LoginController.class.php ,模版为 index.html 。
在 WeiBo/Admin/View/Login/index.html 中写入登录代码:
在 WeiBo/Admin/Controller/LoginController.class.php 中写入代码:
这里登录的 LoginController.class.php 类只要继承 Controller 即可,否则无法
运行。因为继承 AuthController 类的是需要权限控制的类。
这里加了个 logout() 函数,就是在后台主页要退出的函数:
在 WeiBo/Admin/Controller/IndexController.class.php 中完善登出的功能:
第四步:完善 AuthController 类的权限验证过程。
最后的check()判定函数中的 MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 其实在本例子中是 Admin/Index/index ,但由于这个权限规则可能不是固定的,所以用
MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 会通用一点。
check()这个函数是调用的 ThinkPHP/Library/Think/Auth.class.php 中的,括号里面的参数在check()函数前面的注释里有介绍
如果 $sess_auth['uid']==1 则判定为: true ,这时就不会执行下面的 !$auth->check() 函数了,这个check()函数是当不是
admin用户时,则判定为没有权限
最后再写一些数据库中的操作是怎样的,
在 ThinkPHP/Library/Think/Auth.class.php 中可以看到已经写好了sql语句,可以用来增加数据库,复制后在
数据库中粘贴就行,效果如下图:
think_auth_rule
name是授权给用户访问的页面
视频中的权限是 Admin/Index/index
title写的是后台首页
此时id默认是1,这里id是需要认证的规则
think_auth_group
title上写的是默认管理组
status默认是1
给rules设置为1,但是以后还是会设置第2,第3,第4,第5个权限,所以可以设置为1,2,3,4,5...,这时默认管理组就有这些权限,
这些权限就是 think_auth_rule 中的id,因为这些id对应了后面的name,name就是可以访问的权限 这些权限就会分配给 think_auth_group_access ,
think_auth_group_access 中的uid就是程序登录是的 WeiBo/Admin/Controller/LoginController.class.php 中的 $login['uid'] 中的值,这里的 group_id 就是 think_auth_group 中的id.
think_auth_rule 中的表的结构如图:
think_auth_group 中的效果如下图:
think_auth_group_access 的效果如下图:
所谓权限控制,大部分是在管理后台上使用。比如超级管理员登录,会得到所有操作的
控制权;认证专员,只能给会员做认证操作;审核专员,只能操作内容的审核、删除、加精
等操作,以此类推。那么 ThinkPHP 提供了一个内置的 Auth.class.php 类来实现权限控
制,这个类提供了三个表:think_auth_rule(认证规则表)、think_auth_group(用户组
表)、think_auth_group_access(用户和组对应关系表)。当然还要结合自己创建的用户
表进行对应即可
二. 简单登录
第一步:在 Admin 模块下创建一个 IndexController.class.php (默认就有了),创
建 index 方法,输出一句话即可。
namespace Admin\Controller; use Common\Controller\AuthController; class IndexController extends AuthController { public function index(){ echo '后台首页!'; } }
这是通过 URL 访问: http://localhost/demo39/Admin/Index/index ,即可访问。
第二步:在 Weibo 根目录下的 Common 公共模块下创建 Controller 文件夹,并在里面
创建一个 AuthController.class.php 类,这个类用于权限控制。
namespace Common\Controller; use Think\Controller; use Think\Auth; class AuthController extends Controller { protected function _initialize() { $auth = new Auth(); if(!$auth->check()) { $this->error('没有权限'); } } }
这里使用的方法固定为: _initialize() 。由于 AuthController.class.php 继承了
Controller 类,所以,第一步的 Index 类改为继承它。 check() 函数是调用了
ThinkPHP/Library/Think/Auth.class.php 内部的 check() 函数。
namespace Admin\Controller; use Common\Controller\AuthController; class IndexController extends AuthController { public function index() { echo '后台首页!'; } }
此时,我们再访问后台首页的时候,已经没有权限了。主要是 $auth->check() 验证无
法通过的原因。
第三步:创建一个 WeiBo/Admin/Controller/LoginController.class.php ,模版为 index.html 。
在 WeiBo/Admin/View/Login/index.html 中写入登录代码:
<p>三个用户:admin为超级管理员,所有权限;test测试用户,没有权限;guest游客,只有登录权限。</p> <form method="post" action="{:U('index')}"> <p>用户名:<input type="text" name="user" /></p> <p><input type="submit" value="登录" /></p> </form>
在 WeiBo/Admin/Controller/LoginController.class.php 中写入代码:
<?php namespace Admin\Controller; use Think\Controller; class LoginCOntroller extends Controller{ public function index() { if(IS_POST) { $login = array(); switch(I('user',null,false)) { case 'admin': $login['uid']=1; $login['user']='admin'; break; case 'test': $login['uid']=2; $login['user']='test'; break; case 'guest': $login['uid']=3; $login['user']='guest'; break; default: $this->error('登陆用户不存在'); } if(count($login)) { session('auth',$login); $this->success('登陆成功',U('Index/index')); } }else { $this->display(); } } public function logout() { session('[destroy]'); $this->success('退出成功',U('Login/index')); } }
这里登录的 LoginController.class.php 类只要继承 Controller 即可,否则无法
运行。因为继承 AuthController 类的是需要权限控制的类。
这里加了个 logout() 函数,就是在后台主页要退出的函数:
在 WeiBo/Admin/Controller/IndexController.class.php 中完善登出的功能:
<?php namespace Admin\Controller; use Common\Controller\AuthController; class IndexController extends AuthController { public function index(){ echo '后台首页!'; echo '<a href="'.U('Login/logout').'">退出</a>'; } }
第四步:完善 AuthController 类的权限验证过程。
<?php namespace Common\Controller; use Think\Controller; use Think\Auth; class AuthController extends Controller { protected function _initialize() { $sess_auth=session('auth'); if(!$sess_auth) { $this->error('非法访问,正在跳转登录页面',U('Login/index')); } if($sess_auth['uid']==1) { return true; } $auth = new Auth(); if(!$auth->check( MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME,$sess_auth['uid'])) { $this->error('没有权限',U('Login/logout')); } } }
最后的check()判定函数中的 MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 其实在本例子中是 Admin/Index/index ,但由于这个权限规则可能不是固定的,所以用
MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 会通用一点。
check()这个函数是调用的 ThinkPHP/Library/Think/Auth.class.php 中的,括号里面的参数在check()函数前面的注释里有介绍
如果 $sess_auth['uid']==1 则判定为: true ,这时就不会执行下面的 !$auth->check() 函数了,这个check()函数是当不是
admin用户时,则判定为没有权限
最后再写一些数据库中的操作是怎样的,
在 ThinkPHP/Library/Think/Auth.class.php 中可以看到已经写好了sql语句,可以用来增加数据库,复制后在
数据库中粘贴就行,效果如下图:
think_auth_rule
name是授权给用户访问的页面
视频中的权限是 Admin/Index/index
title写的是后台首页
此时id默认是1,这里id是需要认证的规则
think_auth_group
title上写的是默认管理组
status默认是1
给rules设置为1,但是以后还是会设置第2,第3,第4,第5个权限,所以可以设置为1,2,3,4,5...,这时默认管理组就有这些权限,
这些权限就是 think_auth_rule 中的id,因为这些id对应了后面的name,name就是可以访问的权限 这些权限就会分配给 think_auth_group_access ,
think_auth_group_access 中的uid就是程序登录是的 WeiBo/Admin/Controller/LoginController.class.php 中的 $login['uid'] 中的值,这里的 group_id 就是 think_auth_group 中的id.
think_auth_rule 中的表的结构如图:
think_auth_group 中的效果如下图:
think_auth_group_access 的效果如下图:
相关文章推荐
- 北大百炼1005 I Think I Need a Houseboat题解
- DNS服务器
- 自娱自乐--爬虫java实践
- 使用装饰器模式动态设置Drawable的ColorFilter
- 你得学会并且学得会的Socket编程基础知识
- Android-webview加载有道词典
- Effective Java——序列化
- ZH奶酪:在博客中添加Latex公式
- Ubuntu下SSH设置
- JS练习:Dom节点的CRUD操作
- 菜鸟装机问题解决
- 贝叶斯分类(java)
- ArcGIS / C#开发 无法读取Excel(*.xlsx)文件
- Python的print中国输出对齐问题
- struts2 ActionSupport关联源码
- sizeof()用法汇总
- 北大百炼1004 Financial Management 题解
- 用c实现的简单linux shell
- A Magic Lamp(RMQ)
- 读博士最后都会明白的八个道理