Java 跨域身份验证

Java 跨域身份验证,java,http,spring-security,shiro,Java,Http,Spring Security,Shiro,我计划建立一个可以被其他网站访问的Web服务。其思想是web服务必须是安全的,并且访问web服务的每个站点都将根据其注册域进行身份验证 网站所有者将从MyWeb服务的web前端注册他们的域(如foo.com) 接下来,他们的站点将发布HTTP方法(GET、PUT、POST、DELETE等),这些方法通常是Javascript HTTP请求 访问web服务的站点不需要进行身份验证;web服务将确定它来自的域是否已经预先注册,如果是,我将根据站点的域处理请求 我现在想的问题是,这种制度是否会“规

我计划建立一个可以被其他网站访问的Web服务。其思想是web服务必须是安全的,并且访问web服务的每个站点都将根据其注册域进行身份验证

  • 网站所有者将从MyWeb服务的web前端注册他们的域(如foo.com)
  • 接下来,他们的站点将发布HTTP方法(
    GET、PUT、POST、DELETE等),这些方法通常是Javascript HTTP请求
  • 访问web服务的站点不需要进行身份验证;web服务将确定它来自的域是否已经预先注册,如果是,我将根据站点的域处理请求
我现在想的问题是,这种制度是否会“规模化”并“有效”


我使用过ApacheShiro和Spring安全性,但从未遇到过这种需求

请注意,通过设计,您的系统将在不使用密码的情况下对用户进行身份验证。 这意味着,如果使用access,如果用户从中访问,则在进行身份验证后,他将获得
foo.com
用户权限,而不提供密码。 我想建议您使用自己的
预验证处理筛选器解决问题:
在实现
getPreAuthenticatedPrincipal
时,只需获取请求URL,从请求URL中提取域(无子域)信息,并使用
PreAuthenticatedAuthenticationProvider
进行身份验证。
authenticationuserdetails的
preauthenticationdauthenticationprovider的
authenticationuserdetails服务
应该从数据库加载已注册的域。

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

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

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

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

  • 希望这有帮助。请随时发布任何问题。

    是否要根据客户端URL进行身份验证?例如,如果用户从
    http://foo.com
    如果用户从
    http://example.org
    他将访问用户example.org权限等。您在这里看到了什么规模的问题?此外,如果用户从
    http://subdomain.foo.com
    身份验证后应该是什么用户?另外,foo.com?它的扩展性并不比使用自定义令牌差,可能更好,因为所有必需的信息都已经存在于传入的请求中。不过,它能否奏效完全是另一回事。首先,该方案似乎主要针对Javascript客户端。而且很容易伪造连接信息。@michael Right这正是我需要的。至于“规模”,我刚才用这个词的意思是,这个想法是否可以扩展成可行的。@是的,它完全面向Javascript客户端。有人可以建议一个理想的实现吗?我面临的问题是,请求不会来自Servlet或任何服务器端HTTP请求,而是客户端请求,特别是一个Javascript HTTP请求……我没有提到该请求将来自Javascript Ajax调用。因此,跨域您可以了解我在这里要做的事情: