我打算将Ext JS用于大型应用程序.应用程序的功能是基于角色的.用户登录时,只能看到与其相关的菜单和屏幕功能.我的服务器端技术将是Java和JSP.
为了解决这个问题,我有两个想法
.1.在用户使用服务器端技术登录后动态创建Ext JS相关的javascript.servlet/JSP将根据用户角色创建必要的est js代码.
2.具有在视图JSP中设置的Js变量,这些变量将用于确保用户只能使用正确的功能.
什么是确保安全性并在Ext Js应用程序中提供基于角色的UI的最佳方法.
在此先感谢您的想法..
阿卜杜勒·奥拉卡拉
我必须在我当前开发的应用程序中解决类似问题,但权限基于用户所在国家/地区.
我知道你已经是,但只是为了任何人阅读的利益重申,权限应始终在服务器端实现,JavaScript安全性始终是次要的.这是因为任何半脑的人都可以使用bookmarklet或Firebug来执行任意JavaScript并绕过客户端安全性.
我发现有几种方法可以做到这一点,但有两种方法尤其是最理智的方法.无论采用哪种方法,都需要考虑两件事:1)服务器的JavaScript以及如何避免服务于不必要的逻辑; 2)如何避免执行用户无法使用的逻辑.
我的应用程序中的所有小部件都是延迟加载的dojo.require
,因此无需担心不适用于用户的不必要的JavaScript.我对ExtJs库并不是很熟悉,但就我所见,它没有提供类似的方法; 但是,同步ajax调用后跟eval是必不可少的.在任何情况下,在这种方法中,重要的是组件功能不会跨越不同的文件(同样,这通常是好的设计).每个文件都应该是自己的类,用于控制特定的窗口小部件或其他UI元素.
然后,我在服务器生成的JavaScript配置类中设置权限.然后,可以在整个应用程序中引用此类,以了解什么是不允许的内容.
例如,以下方法控制对全局控件中可用的大多数窗口小部件的访问.
com.project.frontController.prototype.init = function(widgets) { var permissions = com.project.config.permissions; // For each widget in the controller for ( var i=0, l=widgets.length; i配置看起来像:
com.project.config.permissions = { "widgetAbc": { btnAccessNode: "#some-css-selector", otherWidgetConfig: "etc" }, "widgetXyz": { btnAccessNode: "div.some-css-selector" } };编译和功能检查:
某些应用程序会将其所有JavaScript编译为一个文件,然后将其提供给客户端.如果您的应用程序执行此类操作,并且您可以设法动态执行此操作,则可以在服务器之前在服务器端确定所有必需的JS.当然,这会产生一些开销; 但是,您可以按角色缓存已编译的版本.如果角色很少,那么可以轻松地启动此缓存,这只是包含一个特定脚本的问题.
由于只有允许的JavaScript可用,所以只需在尝试执行它之前检测所需的类/功能是否可用,就需要进行权限检查.
例如,您的脚本包含可能如下所示:
您的功能检查将是这样的:
com.project.frontController.prototype.init = function(widgets) { // For each widget in the controller for ( var i=0, l=widgets.length; i要么
com.project.someWidget.prototype.launchOtherWidget = function() { if ( typeof otherWidget != "undefined" ) { (new otherWidget()).open(); } };请注意,这两种方法在实现中非常相似.我想说在两者之间做出决定的最佳方法是考虑代码库的大小,可用于动态编译的工具,以及缓存这些基于角色的编译包.对于我的项目,不仅编译器在环境中不可用,而且代码库很大(1.3mb膨胀/ 296kb默认加上dojo库),这是不可接受的,因为客户端对维护低应用程序负载更感兴趣倍.