【问题标题】:Implementing Collaborative Authentication in Java Web Application在 Java Web 应用程序中实现协作身份验证
【发布时间】:2016-08-14 17:58:17
【问题描述】:

我需要构建一个基于 Java 的 Web 应用程序,其中的资源只有在该资源的所有授权用户都登录时才可用。此外,如果任何授权用户注销,则该资源应该不再可用对他们中的任何一个。

资源可以是任何类型(html 页面、pdf 文档、电子表格等)

是否有任何现有的身份验证标准/协议支持此类要求,或者我必须从头开始构建它?

【问题讨论】:

  • 您是否已经在使用任何特定的 Web 框架?
  • 我对 Spring 框架很满意。如果它支持此要求,我也准备切换到任何其他框架。

标签: java authentication web-applications


【解决方案1】:

只有当该资源的所有授权用户都登录时,该资源才应可用。此外,如果任何授权用户注销,则该资源不应再可供任何人使用。

一旦您授予用户访问资源的权限,该用户将能够下载/截屏/保存/记录资源,无论是 PDF 文档、图像还是音频文件。我不知道您尝试构建的内容和目标,但您应该知道它在任何情况下都是不安全的。

即使不考虑这些因素,您也需要一个实时解决方案。一旦用户加载了包含资源的页面,您需要能够隐藏或拒绝他的修改权限。这意味着您必须在客户端使用 WebSockets 或 Ajax Polling 之类的东西来让前端知道您的服务器何时认为并非所有必需的用户都在线,并且应该“拒绝”对资源的访问。但是,由于这是客户端代码,它可以很容易地更改或更改,它发送的请求很容易被用户阻止,因此它再次本质上不安全

我建议在这里提供一点上下文并描述您要解决的问题是什么,因为很可能有更合理的解决方案来解决它。

如果您需要做的是拒绝修改权限,如果不是所有“资源所有者”都在线,那么更容易做到,因为修改将发生在服务器端。在这种情况下,使用 WebSockets 的解决方案可以很容易地实现,但我不知道有一个库或框架可以做这样的事情。很可能您必须自己构建它。

【讨论】:

  • 非常感谢您的回答。它帮助了我,我已经完成了我的要求。不幸的是,由于某些原因,我无法发布我的解决方案。
  • 很高兴我能帮上忙!如果您认为我的回答解决了您的问题,请接受 - 否则您对该问题的奖励将丢失。
  • 对不起。下面的帖子也帮助了我。我很困惑是接受你的还是下面的。
  • 我能理解斗争!只需在接下来的 19 小时内选择两者之一,否则你将白白损失 500 名声望。 :-/
  • 我希望自动选择答案并相应奖励赏金。
【解决方案2】:

如果您不限于使用特定的 Web 框架,请随意尝试以下基于过滤器的球衣实现。请注意,您仍然需要添加大量自定义代码来处理“集体身份验证”的逻辑,因为 jersey 仅提供了所需的基本工具,并没有明确实现整个概念。在高层次上,您可以这样做:

class AuthorizationProvider {

    public void authenticate(ContainerRequestContext requestContext) {

        // Here you would need to query your database to get the Collection of Users belonging 
        // to the "Collective" Role. You would then check if they are all logged in.
        // A really abstract version would look like this, assuming you've already queried the DB
        // and have a reference to the above mentioned Collection.

        if (collectiveUsers.size == collectiveUsers.stream().filter(User::isLoggedIn).count()) {
            return true;
        }
        return false;
    }
}

class AuthorizationRequestFilter implements ContainerRequestFilter {

    private final AuthorizationProvider authorizationProvider;

    @Override
    public void filter(ContainerRequestContext requestContext) {

        if (authorizationProvider.authenticate(requestContext)) {
            // serve whatever it is you want to serve if all required users are logged in
        } else {
            // otherwise reject the request
            requestContext.abortWith(Response
                .status(Response.Status.UNAUTHORIZED)
                .entity("Resource available only after collective login")
                .build());
        }
    }
}

@ApplicationPath("/")
class MyApplication extends ResourceConfig {

    public MyApplication() {
        // Register the filter
        register(AuthorizationRequestFilter.class);
    }
}

除此之外,您还需要处理登录部分。 您将为这些特定用户分配 Collective 角色,并将他们标记为已登录,只要他们成功通过登录身份验证。

如果满足以上所有条件,则只有在所有“集体”用户都登录时,您应该能够成功地提供“仅限集体”页面。

这还包括如果这些用户中的任何一个用户退出,您将状态存储在数据库中的部分(用 isLoggedIn = false 标记集体用户)。所以从现在开始,每当有人请求该页面时,它都会返回 Unauthorized。

相反,如果有人注销,您也可以尝试实施 SSE(服务器发送事件)来主动更新前端部分。这样,即使之前有人已经设法获取该页面,该页面也会被主动禁用。

容器请求过滤器源码及示例,供参考,jersey docs

【讨论】:

  • 非常感谢您的回答。它帮助了我,我已经完成了我的要求。不幸的是,由于某些原因,我无法发布我的解决方案。
  • 很高兴它有帮助!虽然可能有点晚了,但请随时将这一项或上述一项标记为已接受。干杯!
  • 我希望自动选择答案并相应奖励赏金。
猜你喜欢
  • 2011-06-13
  • 2014-01-15
  • 1970-01-01
  • 2012-01-16
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
相关资源
最近更新 更多