2

我打算设置一个可供其他站点访问的网络服务。这个想法是必须保护 Web 服务,并且每个访问 Web 服务的站点都将根据其注册域进行身份验证。

  • 网站所有者将从我的 Web 服务的 Web 前端注册他们的域(如 foo.com)
  • 接下来,他们的站点将发出 HTTP 方法(GET, PUT, POST, DELETE等),通常是 Javascript HTTP 请求
  • 访问 Web 服务的站点无需进行身份验证;Web 服务将确定它来自的域是否已预先注册,如果是,我将根据站点的域处理请求。

我现在在想的问题是这种系统是否会“扩展”并“工作”

我曾使用过 Apache Shiro 和 Spring Security,但我从未遇到过这种要求。

4

2 回答 2

0

请注意,根据设计,您的系统将在没有密码的情况下对用户进行身份验证。这意味着,如果用户从http://foo.com访问时使用访问权限,他将foo.com在身份验证后获得用户权限,而无需提供密码。我想建议您自己解决问题PreAuthenticatedProcessingFilter: http: //static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#d0e6167 在您的实施中getPreAuthenticatedPrincipal,只需获取请求 URL,从请求 URL 中提取域(不包括子域)信息并使用PreAuthenticatedAuthenticationProvider. AuthenticationUserDetailsServiceofPreAuthenticatedAuthenticationProvider应该从数据库中加载注册的域。

于 2013-04-19T15:01:45.030 回答
0

我想我看到了一种使用自定义过滤器的方法:

  1. 添加您自己的自定义过滤器,例如 PartnerSiteCheckerFilter。它将具有每个合作伙伴服务器的 IP 地址列表。它将仅检查 API 请求(例如 /api/**)。任何与 IP 不匹配的请求都将被拒绝 (AccesDeniedException)。
  2. 在注册过程中,将新域保存到数据库,然后获取受信任的 IP 地址列表

    InetAddress[] hosts = InetAddress.getAllByName( "www.stackoverflow.com" );
    for(InetAddress host : hosts) {
        String ip = host.getHostAddress();
    } 
    // add ip to a list
    
  3. 更新 PartnerSiteCheckerFilter 内的 IP 列表。

  4. 准备一些组件,该组件将在应用程序启动时从 DB 读取域列表,然后获取每个服务器的 IP 并将此列表注入 PartnerSiteCheckerFilter。
  5. 每个域的受信任服务器列表可能会在运行时更改。因此,提供一些更新它的方法可能会有所帮助。

希望这可以帮助。随时发布任何问题。

于 2013-04-19T15:30:28.413 回答