跨域身份验证

时间:2013-04-19 14:00:06

标签: java http spring-security shiro

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

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

我现在想到的问题是这种系统是否会“缩放”并且“会起作用”

我曾与Apache Shiro和Spring Security合作,但我从未遇到过这种要求。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  1. 添加您自己的custom filter,类似于PartnerSiteCheckerFilter。它将包含每个合作伙伴服务器的IP地址列表。它只会检查API请求(例如/ api / **)。任何未与IP匹配的请求都将被拒绝(AccesDeniedException)。
  2. 在注册过程中,将新域保存到DB,然后获取可信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. 可以在运行时更改每个域的可信服务器列表。因此,提供一些更新它的方法可能会有所帮助。
  6. 希望这会有所帮助。感觉自由发表任何问题。