【问题标题】:Good way to make Authentication and Authorization information available between application layers在应用程序层之间提供身份验证和授权信息的好方法
【发布时间】:2010-05-16 19:46:32
【问题描述】:

我有一个在 Google App Engine (GAE) for JAVA 上运行的网络应用程序。我在 Servlet 层对客户端进行身份验证,但希望将客户端信息提供给我的业务和数据层,而不必通过每个函数的参数传递客户端对象。

我正在考虑使用 ThreadLocal 设置“会话”类型的对象。这样任何函数都可以这样说:

CurrentUser.getRoles();

这是执行此操作的好方法,还是有其他更受欢迎的解决方案?

谢谢!

【问题讨论】:

    标签: java google-app-engine session authentication thread-local


    【解决方案1】:

    这可能会起作用并且非常方便,但通常我会尽量避免ThreadLocals 用于类似的用例。原因:

    • 您的代码突然开始依赖于底层容器为不同用户使用不同线程这一事实。如果容器将开始使用 NIO、不同类型的线程(例如,在某些异国情调的 JVM 上不会映射到 java.lang.Thread 的绿色线程)等,您将不走运。

    • ThreadLocals 在使用后往往会忘记清理。因此,如果您的服务器使用量激增并且其中一个用户将大量内容放入“缓存”中,那么您可能会用完 RAM。

    • 由于在请求后不清理,ThreadLocal 可能会暴露安全漏洞,假设其他用户会跳转到同一个线程。

    • 最后,我相信 ThreadLocals 是为您可以绝对控制上下文中的线程的环境而设计的,而这个用例远远超出了这个范围。

    很遗憾,我对 GAE 了解不多,无法提出可行的替代方案,对此深表歉意!

    【讨论】:

    • 好答案,但我不认为第一点是正确的,只要他坚持他建议的界面 - CurrentUser.getRoles 并不预先假定专门使用本地线程。
    【解决方案2】:

    ThreadLocals 是一种完全可以接受的存储此类信息的方式。除了我们之外,我还从Alfresco 知道他们这样做了。

    【讨论】:

      【解决方案3】:

      如果使用 Spring 和 Spring Security 对您有用,那么您可以使用我在 jappstart 中构建的代码进行身份验证/授权。然后可以通过 Spring Security 获得此信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 2022-01-14
        • 2011-01-15
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 2011-02-07
        相关资源
        最近更新 更多