首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Yii2 RBAC规则反馈/消息

Yii2 RBAC规则反馈/消息
EN

Stack Overflow用户
提问于 2016-04-01 01:44:37
回答 3查看 385关注 0票数 5

这是一个关于在Yii2中使用RBAC的问题。

到目前为止,我发现它运行得相当好,而且令人满意,但是我缺少一个关键特性: Yii2规则以类似于Yii2验证器设置错误消息的方式提供“反馈”的能力,以解释验证失败的原因。我正在寻找一种方法,以提供某种形式的反馈,为什么不给予许可。

特别是,can()方法将返回布尔类型,这很好,但是在检查权限时,我们不知道为什么没有授予用户确切的权限。

给出一个更实际的例子。假设我们正在尝试确定当前用户是否可以提交评论。我们通常会这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (Yii::$app->user->can('postComment',['comment'=>$comment])) {
    $comment->post();
} else {
    throw new ForbiddenHttpException('Sorry m8, you cant do this. No idea why tho!');
}

它工作得很好,但正如示例中所示,我们真的不知道为什么用户不能发布评论。可能有很多原因,例如因为线程被锁定了,或者因为它们没有在某个类别中发布的权限,或者因为它们没有足够高的声誉等等。但是我们想告诉用户为什么!所以我的问题是,我们如何从易2的RBAC那里得到反馈?

EN

回答 3

Stack Overflow用户

发布于 2016-04-01 08:51:28

您可能希望创建自己的AccessRule,并通过重写该类中的当前方法来设置场景中的消息异常。matchRole将是您要重写的方法。Yii2没有这样的功能,因此您必须使用自己的AccessRule才能这样做。

然后,一旦其创建后,将其附加到控制器上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'ruleConfig' => [
                'class' => 'app\components\AccessRule'
            ],
            'rules' => [
                /* my normal rules */
            ],
        ],
    ];
}
票数 0
EN

Stack Overflow用户

发布于 2016-04-02 14:17:26

所以基本上我所做的就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'message' => 'Current password cannot be blank.' 

遵守我的规则。

确保您分离了正确的规则,这样您就不会在多个字段上得到这条消息,因为这是没有意义的。还请确保将其添加到“必需”规则中,除非您希望该消息在另一个规则时显示出来。

我希望这能帮到你们,因为我花了太多的时间去寻找它。

票数 0
EN

Stack Overflow用户

发布于 2020-04-19 23:26:23

在您的例子中,我将创建一个基本权限类,它将用一个简单的方法覆盖特定限制消息的抽象,它将由扩展--您的所有权限--

这是抽象的许可蓝图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class AbstractPermission extends Permission
{
    /**
     * @return string
     */
    abstract public function getRestrictionMessage(): string;
}

创建自定义数据库管理器,以检查检索到的权限是否实现了抽象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CustomDbManager extends DbManager 
{
    /**
     * @throws \Exception
     * @return AbstractPermission|null
     */
    public function getPermission($name): ?AbstractPermission 
    {
        $permission = parent::getPermission($name);

        if ($permission === null) {
            return null;
        }

        if (!$permission instanceof AbstractPermission) {
            throw new \Exception(
                'Your permission class should be derived from ' . AbstractPermission::class
            );
        }

        return $permission;
    }
}

在配置文件中定义CustomDbManager

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'components' => [
    'authManager' => [
        'class' => CustomDbManager::class
    ],
    ...
];

PostCommentPermission为例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class PostCommentPermission extends AbstractPermission
{
    /**
     * @return string
     */
    public function getRestrictionMessage(): string
    {
        return 'You cannot post comments!';
    }
}

最后,使用特定的权限检查调用您的经理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$authManager = Yii::$app->getAuthManager();

$postCommentPermission = $authManager->getPermission('postComment');

if (Yii::$app->user->can($postCommentPermission->name, ['comment' => $comment])) {
    $comment->post();
} else {    
    throw new ForbiddenHttpException($postCommentPermission->getRestrictionMessage());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36353019

复制
相关文章
Appium移动端自动化测试--元素操作与触摸动作
1.click()点击操作 也可以用tab实现点击操作 driver.find_element_by_id("com.wuba.zhuanzhuan:id/ae8").click()
软测小生
2019/12/26
1.4K0
什么是 WebSockets,什么时候应该使用它们?
在当今高度互联且不断在线的世界中,我们希望即时获得信息。想一想我们用来发送消息或在一天内接收实时、最新通知的所有应用程序。WebSockets是用于构建提供即时、实时更新和通信的 Web 应用程序的众多不同工具之一。
用户1418987
2023/10/16
7050
什么是 WebSockets,什么时候应该使用它们?
文本挖掘| 什么时候可以用到主题建模?
主题建模可以帮助决策者处理大量文本数据,对文档中的名词出现频率进行概率建模。用来估计两个文档和关键词之间的相似性。你是否好奇奥巴马过去几年国会演讲报告,随着时间的推移,他传达的信息有什么变化?接下来,https://github.com/datameister66/data下载奥巴马2011-2015年国会演讲报告。
黑妹的小屋
2020/08/05
5100
文本挖掘| 什么时候可以用到主题建模?
基于python的appium例子
版权声明:如需转载本文章,请保留出处! https://blog.csdn.net/xc_zhou/article/details/89643551
周小董
2019/05/10
2.2K0
基于python的appium例子
性能测试 -- 实际例子
1、环境申请搭建,压测机器的申请; 2、压测场景设计和思考; 3、压测脚本的编写和修改; 4、压测开始,调试,开始正式压测; 5、压测结果分析,定位问题,重新压测; 环境: 应用机器,mock机器,memcache机器,数据库服务器,客户端机器(由于公司有性能平台这里就没考虑),涉及到软件的安装,注意环境变量!! 涉及到的修改 应用的需要的环境变量,/etc/hosts文件, -XX:PermSize=512m 持久代 -Djava.rmi.server.hostname=111.111.111.111 j
千往
2018/01/24
8260
加密通讯可以防止隐私窃取,为何我们都不用它?
前言: 分享这篇文章的原因是这几天在上课的时候,密码学老师讲解的密码学把我吸引住了,说到什么加密解密,讲课逻辑性挺高的,我喜欢—>_<。 其实说到真正分享这篇文章是因为一是很既然有很多加密方式,为什么我们不用?二是自己在运营的网站经常会招来黑手,脚本小子,小黑(我什么都不是)经常攻击我的站,wp的站,经常被暴力破解,虽然在SAE每月有1.5W云豆,同时也害怕有人在DNS污染什么之类的,截获了明文。那不是一年的的劳动连本都没收回来。然后我也在后台使用了https。所以一直很疑问加密通讯可以防止隐私窃取,为何我
FB客服
2018/02/05
9380
加密通讯可以防止隐私窃取,为何我们都不用它?
我们可以教机器学习隐私吗?
机器学习需要使用大量数据来对模型进行训练,而我们一般都会将这些训练数据上传到亚马逊和Google等运营商所托管的机器学习云服务上,但这样将有可能把数据暴露给恶意攻击者。那我们是否能够把机器学习当作一种
FB客服
2018/04/17
8330
我们可以教机器学习隐私吗?
换掉 Maven,我用它!!!
相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:
java进阶架构师
2021/02/05
5410
换掉 Maven,我用它!!!
【Appium】循环等待文本
Appium判断二种元素出来一种即可继续,例如:如果弹出提示则点击提示,如果页面显示某字符则不需要等待弹框。
世平
2021/11/16
1.5K0
触摸静电柱动作行为识别系统
触摸静电柱动作行为识别系统借助ai视频分析技术和风险管控技术需求,开展人员睡岗离岗检测,职工没按规定触摸静电柱这两种风险行为识别分析报警,智能化识别生产作业场所安全隐患,为当代城市安全风险管理提供关键优算法。
燧机科技
2022/09/28
2810
触摸静电柱动作行为识别系统
Python面向对象的实际例子(一)
class语句定义了名为Person的类,然后在构造函数(__init__)中给self赋值。构造函数在实例化的时候会自动调用并自动将实例传入第一个参数self中,然后通过给self赋值,实例就拥有了name,job,age属性。
zy010101
2022/01/10
8770
我们可以教会机器人道德吗?
译者:Amber LI 本文长度为3524字,预估阅读时间7分钟。 引言:我们并不习惯关于机器做道德决定的想法,但它们能自己进行常规道德决定的那天正在逐步逼近。来自BBC的David Edmonds不禁发问,我们该如何教会它们做出正确的决定呢? 轿车按照原定时间在早上8点停在你家旁的路口等待接你上班。你坐进后座,从公事包中拿出电子阅读器扫描新闻。这趟行程从未遇到麻烦,之前最多只是略微塞车而已。但今天不寻常的可怕的事情发生了:两个小孩,互相追逐着从长满草的河岸滑落到你面前的马路上。已经没有时间刹车。而如果轿
iCDO互联网数据官
2018/03/05
8450
我们可以教会机器人道德吗?
Appium 定位方法例子(4)
这是一个攻坚战,来首战斗音乐助兴 有朋友留言反应定位不到元素,没错,船长也为这个一直在头疼,我用的App是原生安卓+webService+h5类型的,定位虽然没问题,但是在进行操作的时
孟船长
2018/05/18
8310
十三、jQuery过时的今天,你还会使用它吗
我至今还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,“原来JavaScript居然可以这样用!”
用户6901603
2020/07/27
1.4K0
十三、jQuery过时的今天,你还会使用它吗
我可以弃用这个端点吗?
让我们假设你是一个开发人员,接管了 Catalog 微服务的所有权。你被要求弃用/v1/catalog 端点而使用新的/v2/catalog 端点。你该怎么做呢?
CNCF
2022/03/25
1.7K0
我可以弃用这个端点吗?
Python这么火,我可以学吗?
越来越多行业都在应用的Python,主要的应用领域有哪些呢?Python每个人都可以学吗?今天我们就来详细看一下。
老九君
2020/03/11
1.2K0
Appium移动端自动化测试--元素操作与触摸动作【移动端自动化测试教程奉上】
之前陆续介绍了移动端测试的相关知识,今天介绍下元素定位之后的操作与触摸动作,学习计划因为各种原因,搁置了很久,接下来继续之前的计划,APP和API接口测试。
软测小生
2020/09/27
1.3K0
用于 Kubernetes 网络的 Cilium:为什么我们使用它以及为什么我们喜欢它
感谢 CNI(容器网络接口),Kubernetes 提供了大量选项来满足您的网络需求。在多年依赖简单的网络解决方案之后,我们面临着对以客户需求为后盾的高级功能的日益增长的需求。Cilium 将我们 K8s 平台中的网络提升到了一个新的水平。
用户5166556
2023/03/18
9290
用于 Kubernetes 网络的 Cilium:为什么我们使用它以及为什么我们喜欢它
点击加载更多

相似问题

什么是切换按钮?我们什么时候可以使用它?

20

C#泛型:我可以在这个例子中使用它们吗?

50

我可以在Appium上使用JavascriptExecutor吗?

10

什么是BroadcastReceiver,我们什么时候使用它?

61

什么是BigInteger,我们什么时候使用它?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文