在任何框架中都少不了定义公共的控制器来执行一些操作

在任何框架中都少不了定义公共的控制器来执行一些操作

比如:用户的非法登录以及RBAC权限控制

这里我们以RBAC作为实例来进行代码示范:

RBAC实现思路:

所需表:
       用户表
       角色表
       用-角派生表
       节点表
       节-角的派生表

大致步骤:
1、首先根据用户id 查询用-角派生表 查出角色id
2、在根据角色id 查询 节-角派生表 查出改角色对应节点id 中的控制器和方法
3、再用当前的的控制器和方法进行比对 如果没有就权限给出提示



1、首先说一下什么是RBAC

基于角色的访问控制(Role-Based Access Control),作为传统访问控制(自主访问,强制访问)的有前景的受到广泛的关注,在RBAC中,权限与角色相关联,用户通过角色的成员得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据他的责任和资格来被指派响应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并并赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

2、测试中我们可以做一个简单的登录,将用户名和id存入到session中,方便以后的使用

3、yii框架中的权限分配

我们在学习PHP的过程中应该对TP框架中的RBAC很熟悉,其实框架之间的内容大多数都是相同的,下面让我们来看一下yii框架中的RBAC。

配置RBAC

在开始定义授权数据和执行存取检查之前,需要先配置应用组件yii/base/Application::authManager。yii提供了两套授权管理器;yii/rbac/phpManager和yii/rbac/DbManager。牵着使用PHP脚本存放授权数据,而后者使用数据库存放授权数据。如果你的应用不要求大量的动态角色和权限管理,你可以考虑使用前者。

下面是两个文件的位置



配置在frontend/backend文件夹,config文件夹下main.php


或者


建立公共控制器,继承controller,然后其他控制器继承公共控制器

新建控制器中,建立beforeAction方法,

class CommonController extends Controller{

public function beforeAction($action){

$session=\Yii::$app->session;

//取出存入的session值

$user_session=$session->get('存入的session名');

//判断是否有登录session

if(!isset($user_session)){

echo "请先登录";

}

//判断当前用户的权限

//获取当前访问的控制器

$controller=Yii::$app->controller->id;

//获取当前访问的方法

$action=Yii::$app->controller->action->id;

//如果当前访问的首页权限是公共的,则开放访问

if($controller=="admin" && $action="index"){

return true;

}

//取出session中存入的id值

$id_session=$session->get("存入的id名");

//查询出改用户的节点

//执行sql语句

$rows=Yii::$app->db->createCommand($sql)->queryAll();

//进行判断,如果有数据就进行判断,没有数据,则给一个警告

if($rows){

foreach($rows as $k => $v){

if($v['controller']==$controller && $v['action']==$action){

return true;

}

}

}else{

echo "抱歉,您的使用权限不够";

}

}

}


如果在以上代码的执行中,出现页面不显示的错误,就再添加下面的代码

if (!parent::beforeAction($action)) {
    return false;
}
return true;

代码: <?php
namespace frontend\controllers;
use Yii;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
use frontend\models\PasswordResetRequestForm;
use frontend\models\ResetPasswordForm;
use frontend\models\SignupForm;
use frontend\models\ContactForm;
use yii\db\Query;
//use frontend\models\ListtModel;  

class CommonController extends Controller{
    public function beforeAction($action){
        $session=\Yii::$app->session;
        $user_session=$session->get('user');
        //判断是否有登录session
        if(!isset($user_session)){
            echo "<script>alert('请先登录');location.href='index.php?r=login/login'</script>";
        }
        //判断权限
        $ctl=Yii::$app->controller->id;     //获取当前访问的控制器
        //var_dump($ctl);die;
        $action=Yii::$app->controller->action->id;     //获取当前访问的方法
        //当访问后台是首页权限是公共的
        if($ctl=="admin" && $action=="index"){
            return true;
        }
        $id_session=$session->get('id');       //接到用户登录时存的id
        //var_dump($id_session);die;
        $sql="select  rn.node_id,n.controller,n.action  from role_node as rn left join node as n on  rn.node_id=n.node_id where role_id in(SELECT role_id from  user_role where user_id=$id_session) group by rn.node_id";
        $rows=Yii::$app->db->createCommand($sql)->queryAll();    //查询出该角色的权限
        //var_dump($rows);die;
        if($rows){
            foreach($rows as $key => $val){
                if($val['controller']==$ctl && $val['action']==$action){
                    return true;
                }else{
                    echo "<script>alert('抱歉,您的权限不够');location.href='index.php?r=login/login'</script>";
                }
            }
        }else{
            echo "<script>alert('抱歉,您的权限不够');location.href='index.php?r=login/login'</script>";
        }
        if (!parent::beforeAction($action)) {
            return false;
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值