我们在开发中经常遇到对方的接口请求有频率限制,比如当前接口每秒的请求不能大于100,不能大于1000,对于这样的,我们作为请求方,如何做限定?
要实现页面按钮权限控制,你得PasteFormHelper的版本必须是26.1.5以上!
<PackageReference Include="PasteFormHelper" Version="26.1.6" />
之前我们把Dto转化成管理端元数据使用的函数是
/// <summary>
/// 读取ListDto的数据模型
/// </summary>
/// <returns></returns>
[HttpGet]
public VoloModelInfo ReadListModel()
{
var _model = PasteBuilderHelper.AttributeReadModelProperty<GradeInfoListDto>(new GradeInfoListDto());
var _query_model = PasteBuilderHelper.AttributeReadModelProperty(new InputQueryGradeInfo());
if (_query_model != null)
{
_model.QueryProperties = _query_model.Properties;
}
return _model;
}
关键点就是
AttributeReadModelProperty
如果你要改成按钮权限过滤,则需要修改成如下
/// <summary>
/// 读取ListDto的数据模型
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<VoloModelInfo> ReadListModel()
{
//var buttons = new List<ButtonRoleModel> { new ButtonRoleModel { Path="AreaInfoListDto",Code="root1" }, new ButtonRoleModel { Path = "AreaInfoListDto", Code = "root2" } };
//var _model = PasteBuilderHelper.AttributeReadModelProperty2(new AreaInfoListDto(), buttons);
var _model = PasteBuilderHelper.AttributeReadModelProperty2(new AreaInfoListDto(), await base.CurrentButtonsAsync());
var _query_model = PasteBuilderHelper.AttributeReadModelProperty(new InputQueryAreaInfo());
if (_query_model != null)
{
_model.QueryProperties = _query_model.Properties;
}
return _model;
}
关键点在函数AttributeReadModelProperty2的调用
传入的buttons
这里有几个约定!
如果你传入null表示不启用按钮权限过滤,也就是全部放行!
如果你要传入说,当前用户没有权限,则你应该传入空数组而不是null
需要实现按钮权限显示,你在[PasteMenu] [PasteIfMenu] [PasteButton] 中,传入btnCode,表示按钮值
如果不传入btnCode表示不启用过滤,也就是全部放行!
///<summary>
///地区数据
///</summary>
[Description("地区数据")]
[PasteEnable(0, 1, 1, 1)]
[PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]
[PasteButton("完善全名称信息", "func_area_fullname()", "", "", btnCode: "admin2")]
[PasteButton("载入数据", "global_load_area_data()", "", "重新载入地区原始数据", btnCode: "admin")]
[PasteButton("备份数据", "global_backup_area_data()", "", "保存现有的地区数据")]
public class AreaInfoListDto : EntityDto<long>
{
}
注意看我上面的
那么在权限列表的时候怎么配置的呢?
路径就是上面案例中的Path,你也可以用表示所有
权限就是,上面特性配置的btnCode,当然,也支持表示所有
权限中配置按钮的作用,就是最终读取给当前用户的buttons
我们都知道,像新增,编辑,详细,删除等都是默认按钮,其中新增按钮最为特殊!
如果你要把新增按钮改成可控制的,你需要
[PasteEnable(0, 1, 1, 1)]
[PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]
不知道你是否还记得[PasteEnable]
表示的意思是,是否启用,新增,编辑,删除,详细,设置为1表示启用,设置为0表示禁用,
上面的意思就是先禁用系统默认的!
然后在设置
[PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]
这里面的add就是对应的新增默认按钮,而函数tap_add_form就是新增的点击事件,照着写就行了!
注意
!!上面的这2个的特性顺序不能变,先禁用,然后配置,配置了add后会启用按钮,关键点在于btnCode引入了权限!!
至于表格中的编辑,详细,删除按钮,那就全部禁用,然后自行实现即可,比如
/// <summary>
/// 删除
/// </summary>
[PasteHidden]
[PasteMenu("删除", "handler_tap_del(this)", btnCode: "del")]
public int Menu1 { get { return 0; } }
注意
如果给[PasteMenu]配置了btnCode,在他上面要标记[PasteHidden],
因为前端是找到了PasteMenu的时候,才把对象隐藏的,如果没有权限,则直接返回Menu1了,会被当前表格的列处理了!
[PasteIfMenu]同理!!!
由上,是否发现使用PasteForm要实现按钮权限控制显得非常简单,也符合PasteForm的宗旨“All in Dto”!
只需要在Dto中写一两行代码,即可实现基于用户的权限控制!!!
注意这里的操作,只是针对管理端,如果用户F12自己修改了,还是能调用的,所以安全问题不在前端,而在后端!
也就是后端还是要进行权限控制的!!!
如果是有AppService的接口可以配置权限,那么如果使用DefaultAppService的如何控制权限呢?
请查看[PasteAuth]特性,就是专门为DefaultAppService的权限控制的!!!
贴代码
贴代码
12345
随风
应该和之前的PasteForm引入有关,之前的版本引入了大量的API,看看10月份或者11月份的版本,新版本的PasteForm极大的优化了API接口量,可以说直接从4N优化到了N个(N代表数据表数量)
已经升级了,主要是left join的查询的时候没有过滤,其实这个问题,多租户也是一样的!