我正在尝试使用Dojo开发一个纯JavaScript的Web应用程序.我面临的问题是限制对部分应用程序的访问.经过身份验证的用户应该能够访问所有内容,而未经过身份验证的用户应该只能访问登录屏幕.
问题是没有(我知道)将阻止用户打开浏览器javascript终端并输入类似:app.displayRestrictedContent();从而获得对经过身份验证的用户的屏幕的访问权限.
我已经实现了基于ajax的登录;所有ajax调用都通过会话进行保护.因此,虽然未经过身份验证的用户可以加载受限制的屏幕,但他们无法为其获取数据.但是,这个屏幕可以随意访问似乎是错误的.
我想做不可能的事吗?编写if(user.auth)app.displayRestrictedContent();等代码似乎很愚蠢.什么时候这么容易被规避.这让我相信我错过了一些对其他人来说相当明显的东西.我在基于纯JavaScript的应用程序和身份验证模型上找不到太多信息.
当然,编译后的可执行文件并没有受到特别的限制,因为它已被制作成很难读取或反编译成有用的机器代码.但是,使用Javascript,应用程序通常与您编写的完全一样,因此很容易修改和推理.
这让我想到了第一个半解决方案:混淆你的Javascript.如果您使用带有shrinksafe参数的Dojo构建工具,则会删除所有不必要的空格并缩短所有标识符,从而使代码很难阅读.我称这是一个半解决方案,有些人可能会说,即使这给了它太多的信任 – 我自己仍然认为这是值得做的.毕竟,缩小的代码也下载得更快!
我在我的应用程序中采取的第二个措施是将不同的部分分成“构建层”.例如,在我的构建配置文件中,我会有类似的东西
dependencies = {
..
layers: [
{ name: "../myApp/Core.js",resourceName: "myApp.Core",dependencies: ["myApp.Core","myApp.Foobar"]
},{ name: "../myApp/modules/Login.js",resourceName: "myApp.modules.Login",dependencies: ["myApp.modules.Login","myApp.modules.LoginUi"...],layerDependencies: ["../myApp/Core.js"]
},{ name: "../myApp/modules/Secret.js",resourceName: "myApp.modules.Secret",dependencies: ["myApp.modules.Secret","myApp.modules.SecretUi"],layerDependencies: ["../myApp/Core.js"],authentication: 42
}
]
}
现在,我不是直接将构建的JS文件作为静态文件提供,而是让请求通过我的服务器端应用程序中的控制器,该应用程序检查JS层是否需要身份验证以及用户是否以必要的访问权限登录.
这确实有一定的缺点. JS文件没有被缓存,如果我在一个构建层中拥有所有JS,那么应用程序的加载速度可能会稍快一些.当然,制作图层的细微差别也是有限的.更多层意味着更麻烦,但更精细的模块访问.
我有兴趣听到其他人也对此感兴趣.这是一个很好的问题.