zoukankan      html  css  js  c++  java
  • auth 权限控制

    一. 权限介绍
    所谓权限控制,大部分是在管理后台上使用。比如超级管理员登录,会得到所有操作的
    控制权;认证专员,只能给会员做认证操作;审核专员,只能操作内容的审核、删除、加精
    等操作,以此类推。那么 ThinkPHP 提供了一个内置的 Auth.class.php 类来实现权限控
    制,这个类提供了三个表:think_auth_rule(认证规则表)、think_auth_group(用户组
    表)、think_auth_group_access(用户和组对应关系表)。当然还要结合自己创建的用户
    表进行对应即可

    二. 简单登录
    第一步:在 Admin 模块下创建一个  IndexController.class.php (默认就有了),创
    建 index 方法,输出一句话即可。

    1 namespace AdminController;
    2 use CommonControllerAuthController;
    3 
    4 class IndexController extends AuthController {
    5     public function index(){
    6         echo '后台首页!';
    7     }
    8 }

    这是通过 URL 访问: http://localhost/demo39/Admin/Index/index ,即可访问。

    第二步:在 Weibo 根目录下的 Common 公共模块下创建 Controller 文件夹,并在里面
    创建一个  AuthController.class.php  类,这个类用于权限控制。

    namespace CommonController;
    use ThinkController;
    use ThinkAuth;
    
    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() 函数。

    1 namespace AdminController;
    2 use CommonControllerAuthController;
    3  class IndexController  extends AuthController {
    4  public  function index() {
    5  echo '后台首页!';
    6   }
    7 }

    此时,我们再访问后台首页的时候,已经没有权限了。主要是 $auth->check() 验证无
    法通过的原因。

    第三步:创建一个 WeiBo/Admin/Controller/LoginController.class.php   ,模版为  index.html 。

    在 WeiBo/Admin/View/Login/index.html 中写入登录代码:

    1 <p>三个用户:admin为超级管理员,所有权限;test测试用户,没有权限;guest游客,只有登录权限。</p>
    2 <form method="post" action="{:U('index')}">
    3     <p>用户名:<input type="text" name="user" /></p>
    4     <p><input type="submit" value="登录" /></p>
    5 </form> 

    在 WeiBo/Admin/Controller/LoginController.class.php 中写入代码:

     1 <?php
     2 namespace AdminController;
     3 use ThinkController;
     4 
     5 class LoginCOntroller extends Controller{
     6     public function index() {
     7         if(IS_POST) {
     8             $login = array();
     9             switch(I('user',null,false)) {
    10                 case 'admin':
    11                   $login['uid']=1;
    12                   $login['user']='admin';
    13                   break;
    14                 case 'test':
    15                   $login['uid']=2;
    16                   $login['user']='test';
    17                   break;
    18                 case 'guest':
    19                   $login['uid']=3;
    20                   $login['user']='guest';
    21                   break;
    22                 default:
    23                   $this->error('登陆用户不存在');
    24                 }
    25                 if(count($login)) {
    26                     session('auth',$login);
    27                     $this->success('登陆成功',U('Index/index'));
    28                 }
    29             }else {
    30                 $this->display();
    31             }
    32         }
    33         public function logout() {
    34             session('[destroy]');
    35             $this->success('退出成功',U('Login/index'));
    36         }
    37     }

    这里登录的 LoginController.class.php 类只要继承 Controller 即可,否则无法
    运行。因为继承 AuthController 类的是需要权限控制的类。

     这里加了个 logout() 函数,就是在后台主页要退出的函数:

    在 WeiBo/Admin/Controller/IndexController.class.php 中完善登出的功能:

     1 <?php
     2 
     3 namespace AdminController;
     4 use CommonControllerAuthController;
     5 
     6 class IndexController extends AuthController {
     7     public function index(){
     8         echo '后台首页!';
     9         echo '<a href="'.U('Login/logout').'">退出</a>';
    10     }
    11 }

    第四步:完善 AuthController 类的权限验证过程。

     1 <?php
     2 namespace CommonController;
     3 use ThinkController;
     4 use ThinkAuth;
     5 
     6 class AuthController extends Controller {
     7     protected function _initialize() {
     8         $sess_auth=session('auth');
     9         if(!$sess_auth) {
    10             $this->error('非法访问,正在跳转登录页面',U('Login/index'));
    11         }
    12         if($sess_auth['uid']==1) {
    13             return true;
    14         }
    15         $auth = new Auth();
    16         if(!$auth->check( MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME,$sess_auth['uid'])) {
    17             $this->error('没有权限',U('Login/logout'));
    18         }
    19     }
    20 }

     最后的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 的效果如下图:

  • 相关阅读:
    [中文] 以太坊(Ethereum )白皮书
    走近比特币:一个故事看懂“区块链”
    MAC下redis的安装和配置
    mysql查询优化
    mac上用VMWare虚拟机装Linux-Ubuntu
    rest-framework框架
    浅谈设计模式
    [BZOJ3786]星系探索(欧拉序+非旋treap)
    [SDOI2017]遗忘的集合(多项式ln+生成函数+莫比乌斯反演)
    [LuoguP4841]城市规划(多项式ln+生成函数)
  • 原文地址:https://www.cnblogs.com/jacson/p/4600856.html
Copyright © 2011-2022 走看看