在任何框架中都少不了定义公共的控制器来执行一些操作
2016-11-08 11:23
218 查看
在任何框架中都少不了定义公共的控制器来执行一些操作
比如:用户的非法登录以及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 "抱歉,您的使用权限不够";
}
}
}
如果在以上代码的执行中,出现页面不显示的错误,就再添加下面的代码
代码:<?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;
}
}
比如:用户的非法登录以及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;
}
}
相关文章推荐
- 使用在控制器中的方法上添加注解的方式来对添加注解的方法执行前做一些预处理操作或者后处理操作
- Tp框架 之对控制器的一些操作等
- linux操作之:设置系统启动时,自动启动一些程序,或者执行一些命令
- 有个服务器端程序一直运行在服务器上,如何接收来自网页的请求,让他执行一些操作呢?
- Spring BeanPostProcessor接口 (在Spring实例化bean的前后执行一些附加操作) .
- 用公共表表达式完成一些对特殊部门的操作
- 关于php操作mysql执行数据库查询的一些常用操作汇总
- 在IE关闭时,转到一个页面中,执行一些操作,然后关闭IE.
- 理解执行计划中的一些sort操作
- Think php 空操作 执行了没定义的执行方法而执行的操作 _empty
- Rhino——一个可以在Java中操作和执行JS的框架
- 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
- 域控制器之操作主机中应注意的一些常见问题 推荐
- 模板方法模式(Template Method)-定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- WINFORM中,怎么在窗体内容全部显示(form_load)之后,执行一些代码或操作(暂时只用过定时器)
- CodeIgniter框架模型(model),视图(view)和控制器(controller)中的文件操作
- 一些用于公共定义的ID和Class名称
- Session失效时执行一些操作(转帖备忘)
- 在web页面上放了一些服务器按钮,在各个按钮的单击事件中都有代码!可不知道哪里出问题了,怎么操作都不能触发这些事件,好象代码一点都不执行!根本没办法调试!请高手指点一二!谢谢!
- dijit.Tree(1)——点击节点时执行一些定制操作