【问题标题】:ExtJS and page authorization (server-side)ExtJS 和页面授权(服务器端)
【发布时间】:2012-02-24 18:23:45
【问题描述】:

我正在寻找有关如何使用 ExtJS 4 实现安全页面的信息。我所说的安全页面是指用户将使用 Siteminder (SSO) 登录我们的网站,因此我们将拥有用户的身份。然后,我们将通过调用数据库/LDAP 来确定用户将拥有哪些角色,并仅呈现用户有权访问的那些视图/组件。

想到几个问题:

1.) 当然,我希望我们会在服务器端呈现页面之前进行授权检查,那么在触发 Ext.onReady() 之前如何执行此操作?我需要让 ExtJS 等待来自服务器的响应吗?

2.) 组织页面组件的最佳方式是什么,可能有人可以看到特定组件而其他人看不到?

3.) 我如何将生成的页面(即用户有权访问的部分)交付给客户端?

TIA!

【问题讨论】:

    标签: extjs extjs4


    【解决方案1】:

    如果您具有 Java 背景并且习惯使用 Spring,我编写了一个使用 Spring Security here 的方法。这将允许您插入任何您想要的身份验证机制。主要区别在于,我没有使用index.html 引导应用程序,而是使用JSP 以便Spring Servlet 过滤器将触发进行身份验证。 Ext JS 应用程序会阻塞,直到用户通过身份验证并提供用户的角色/权限。

    【讨论】:

    • 这确实是这样做的最佳示例,即使它是以 Java 为中心的。感谢您提供此链接!
    【解决方案2】:
    1. 使用服务器端技术通过将 JS 应用启动脚本放入 JSP/GSP 来预处理授权。这样做是强制服务器端组件首先启动,然后将 HTML/JS/CSS 呈现给客户端。对于完整的 RIA 应用程序,请使用 index.gsp(或 jsp),并且您的 URL 保持为“domain/contextroot”。

    2. 您可以通过对服务器的 ajax 请求询问对内容的访问权限,或者您可以再次通过 JSP 技术设置 JS 变量,该技术在返回其余客户端响应之前首先处理。

      //global env var definition 
       var env = "${System.getProperty(Environment.KEY)}";
    
    < /g:javascript>
    

    这两者都不是 100% 安全的,因为客户端代码可以更改。当数据提交处理时,真正的安全执行必须在服务器端进行。

    '3.简单的方法是根据上面的 2. 隐藏/显示视图等。还有一些通过延迟(手动)初始化可能需要也可能不需要的控制器来模块化客户端 MVC 应用程序的实验。

    希望这会有所帮助。

    数据库 :)

    【讨论】:

      【解决方案3】:

      我目前正在尝试以下解决方案。虽然它只适用于用户群相当简单的应用,但它可能对您有所帮助。

      首先,用户身份验证是在没有 extjs 的情况下完成的,使用一个简单的 HTML/CSS 页面。用户登录后,其详细信息(用户 ID、角色)将保存到 PHP 会话中。然后页面重定向到两个 extjs 应用之一。

      一个普通用户的应用程序(我称他们为客户端),这些人的客户端 JS 不包含任何管理功能。另一个应用程序是供管理员使用的。

      这两个应用程序的类都继承自基类。例如,我们有base.mainMenu,admin.mainMenu 和clients.mainMenu 都从该base.mainMenu 继承。 app.js 脚本中唯一的区别是加载的控制器,并且每个 extJS 4 动态加载模块,只加载相关的视图(即,在客户端看到)。就我而言,无论如何,所有页面都是动态加载的,所以我的用户只能在他们的主菜单中动态加载页面。

      管理应用程序使用包含用户角色的全局 JS 变量来阻止某些功能。因此,例如,一旦加载视图(实际上,这实际上是通过不加载允许对视图进行编辑的插件来完成),就可以向版主(具有较少权限的管理员组)隐藏“编辑”按钮。

      总而言之,对服务器的任何调用都会检查会话用户是否具有所请求操作的权限,因此无论客户端脚本如何,服务器操作都只能由具有适当权限的人执行。

      总而言之,您可以混合搭配 3 种不同的策略:

      • 为不同的用户加载不同的应用程序。如果您的类都是基类所固有的,这比维护 2 个或更多完全不同的应用程序要容易。
      • 使用全局 JS 变量为某些用户禁用/启用某些功能。仅当您对随后被禁用的客户端加载功能(但调试器仍能看到)没有问题时,这才有用。
      • 无论如何,所有服务器端调用都会根据会话变量进行检查。

      【讨论】:

        【解决方案4】:
        1. 查看Role-based access control。我使用 Yii 的基于数据库的 RBAC,并且有一个 php 脚本,它在 ext 启动时以 json 格式返回 rbac 规则

        2. 在客户端上,最好的办法是简单地隐藏或禁用不允许的功能。

        3. 在服务器上,如果不允许用户执行某项功能,您应该抛出403 http error。在 ext 中处理 ajax 异常并检查 403。

        【讨论】:

          猜你喜欢
          • 2021-02-05
          • 2015-08-26
          • 2011-07-04
          • 2018-09-26
          • 2019-10-03
          • 2013-08-23
          • 1970-01-01
          • 1970-01-01
          • 2020-06-23
          相关资源
          最近更新 更多