我的网站中有很多级别的用户权限。
因此 junior 用户无法执行 senior 用户可以执行的操作。 (有很多级别的用户。高级vs初级只是为了简化)。
在添加到服务器端验证谁是用户以及他能做什么 - 我还希望 NOT 提供 Javascript 功能注册在第一个地方。 (因此,如果用户是 junior 用户,那么他的JS文件不应包含 senior 用户的JS函数。)
示例:
该网站有一般add
个javascript函数,应该出现在所有用户身上:
function add() {
console.log("Add");
}
初级用户拥有更高的权限,因此他们也可以subtract
。所以他们的JS文件包含subtract
方法:
function substract() {
console.log("substract");
}
一般用户不会使用此substract
方法
高级用户拥有更高的权限,因此他们也可以power
。所以他们的JS文件包含power
方法:
function power() {
console.log("power");
}
高级用户不会拥有此power
方法
行
根据this answer:
请注意,每页必须有一个单独的包。你不应该 动态修改同一个包......等等......
所以,我创建了(现在)2个捆绑包,每个页面一个:
bundles.Add(new ScriptBundle("~page1Junior").Include(
"~/Scripts/General.js", "~/Scripts/Junior.js"));
bundles.Add(new ScriptBundle("~page1Senior").Include(
"~/Scripts/General.js", "~/Scripts/Senior.js"));
然后我根据一些登录信息获取相关的捆绑包并使用:
<script src='@Scripts.Url("~/page1Senior (or) Junior")' async> </script>
问题
这似乎是一种错误的方法。
如果我有10
个页面和10
个用户级别,根据这种方法,我需要 100 不同的捆绑包。
为相关用户权限提供适当的js文件的正确方式是什么?
我之后的伪代码:
user level js files(combined to one)
------------|-------------
1 [a,b]
2 [a,b,c]
3 [a,b,c,d]
4 [a,b,c,d,e]
因此,如果用户级别3已登录,则应提供单个abcd.js
JS文件(缩小)。
答案 0 :(得分:3)
一种方法是使用DynamicBundleFolder
如果你有一个像
这样的目录结构Scrtips
-- /Permissions
-- /1
-- a.js
-- b.js
-- /2
-- a.js
-- b.js
-- c.js
-- /3
-- c.js
-- d.js
其中1,2,3是限制级别,然后在RegisterBundles
添加DynamicBundle
bundles.Add(new DynamicFolderBundle("userScripts", "*.js",new JsMinify()));
然后在你的_layout.cshtml中,你可以做到
@{
var userPermissionLevel = 2; // grab your user permission level, from session maybe
}
@Scripts.Render("~/Scripts/Permissions/"+ @userPermissionLevel +"/userScripts")
这将呈现该目录中的所有脚本。您不必为每个页面创建包。如果您需要添加基于新权限的文件,只需添加到相应的权限文件夹。
更新:如果每个权限级别都有唯一的js文件,这将正常工作。对于共享文件,更新它们将是一项非常重要的工作。所以你可以做的是根据权限级别创建捆绑包,如
// Bundle for permission level 1
bundles.Add(new ScriptBundle("~/bundles/permissions/1").Include(
"~/Scripts/a.js")
.Include("b.js"));
// Bundle for permission level 2
bundles.Add(new ScriptBundle("~/bundles/permissions/2").Include(
"~/Scripts/b.js")
.Include("c.js"));
// and so on for each level 3,4,5 include specific level files
然后您可以将它们添加到_layout.cshtml
@{
var userPermissionLevel = 2; // grab your user permission level, from session maybe
}
@Scripts.Render("~/bundles/permissions/"+userPermissionLevel)