security - 如何使用 GWT 2.1 的 RequestFactory 处理安全约束?

标签 security google-app-engine authentication gwt servlets

我目前正在开发将部署在 Google App Engine 上的 GWT 2.1 应用程序。我想使用新的 RequestFactory 实现服务器通信。

现在我的问题是如何处理这种情况下的细粒度安全问题?某些服务器操作(在 RequestContext stub 中声明的那些操作)应仅限于某些用户(可能取决于远程调用的参数)。如果调用未经授权,我希望客户端显示一个登录页面(例如,这样一个人可以以不同的用户身份登录)。

从 Expenses 示例中,我知道如何实现到登录页面的自动重定向,但在这个示例中,安全模型非常简单:当且仅当用户登录时,客户端才可以访问 servlet .

我应该在服务器端服务中引发自定义 UnAuthorizedException 吗?我应该在哪里拦截这个异常? (我可以在像费用示例的 GaeAuthFilter 这样的 servlet 过滤器中执行此操作吗?)

最佳答案

我也在寻找解决方案,并提出了以下建议。它并不完全处理用户界面方面的事情(即重定向到登录页面),但它会保护您的数据层免受未经授权的访问。

public class MyRequestFactoryServlet extends RequestFactoryServlet
{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException
    {
        if (! userIsLoggedIn(req))
        {
            throw new ServletException("not logged in");
        }
        else
        {
            super.doPost(req, res);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
    {
        if (! userIsLoggedIn(req))
        {
            throw new ServletException("not logged in");
        }
        else
        {
            super.doGet(req, res);
        }
    }

    protected boolean userIsLoggedIn(HttpServletRequest req)
    {
        // insert your custom code here for checking session for valid login token
        User user = (User) req.getSession().getAttribute("LOGGED_IN_USER");
        return user != null && user.isEnabled();
    }

然后在 web.xml 中使用 MyRequestFactoryServlet 而不是 RequestFactoryServlet。

为了处理登录的 UI 方面,我使用 GWT RPC 让我的应用程序的登录页面检查是否有效登录;如果用户未登录,系统会提示他们输入用户名/密码。上面的代码保护后端免受试图通过直接跳转到其他 URL 或通过手动将数据发布到 servlet 来绕过登录页面的用户。

关于security - 如何使用 GWT 2.1 的 RequestFactory 处理安全约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557286/

相关文章:

sql - Postgres 注入(inject)工具

html - .htaccess 这个网页有一个重定向循环 htaccess

security - 证书对内网 SSL 有用吗?

javascript - 如何防止此广告网络 http 请求?以及如何插入请求?

mysql - 我应该在客户端代码中存储什么作为索引?

对 Coinbase Exchange 私有(private) API 的 PHP 身份验证

web-services - Glassfish、EJB3、SOAP Web 服务和基本身份验证

php - 将 URL 中的用户名和密码传递给 PHP 页面?

java - 谷歌应用程序引擎的移动后端启动器中的源代码错误---Android客户端

java - 如何在 App Engine v1.9.18 中将 app.yaml 与 Java 运行时一起使用?