Java Cloudfoundry UAA资源应用程序(/api)在不同域中运行时访问被拒绝

Java Cloudfoundry UAA资源应用程序(/api)在不同域中运行时访问被拒绝,java,oauth-2.0,spring-security-oauth2,cloudfoundry-uaa,Java,Oauth 2.0,Spring Security Oauth2,Cloudfoundry Uaa,在localhost:8080上运行带有/api和/app all的/uaa没有问题。授权代码流和隐式流都可以完美地工作 然而,我发现在同一个域上运行所有应用程序几乎不现实,所以我决定在不同的域上测试它们。以下是我所做的: -本地主机上的Boot/uaa:8080 -本地主机上的Boot/api:8181 -本地主机上的启动/应用程序:8282 -更改所有url配置以指向正确的地址 授权流程仍然运行良好。但是,我的访问被拒绝,导致隐式流上出现javascript错误 当/app尝试联系/api时

在localhost:8080上运行带有/api和/app all的/uaa没有问题。授权代码流和隐式流都可以完美地工作

然而,我发现在同一个域上运行所有应用程序几乎不现实,所以我决定在不同的域上测试它们。以下是我所做的: -本地主机上的Boot/uaa:8080 -本地主机上的Boot/api:8181 -本地主机上的启动/应用程序:8282 -更改所有url配置以指向正确的地址

授权流程仍然运行良好。但是,我的访问被拒绝,导致隐式流上出现javascript错误

当/app尝试联系/api时,/api抛出以下命令:

------------------------------------------------------------------------------------
DEBUG --- FilterSecurityInterceptor: Secure object: FilterInvocation: URL: /apps; Attributes: [scope=cloud_controller.read]
[2013-11-04 18:26:42.521] samples/api - ???? [http-8181-2] .... DEBUG --- FilterSecurityInterceptor: Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@9055c2bc: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS
[2013-11-04 18:26:42.521] samples/api - ???? [http-8181-2] .... DEBUG --- UnanimousBased: Voter: org.springframework.security.oauth2.provider.vote.ScopeVoter@54b82ec7, returned: 0
[2013-11-04 18:26:42.521] samples/api - ???? [http-8181-2] .... DEBUG --- UnanimousBased: Voter: org.springframework.security.access.vote.AuthenticatedVoter@8073645, returned: 0
[2013-11-04 18:26:42.522] samples/api - ???? [http-8181-2] .... DEBUG --- ExceptionTranslationFilter: Access is denied (user is anonymous); redirecting to authentication entry point
org.springframework.security.access.AccessDeniedException: Access is denied
    at org.springframework.security.access.vote.AbstractAccessDecisionManager.checkAllowIfAllAbstainDecisions(AbstractAccessDecisionManager.java:70)
    at org.springframework.security.access.vote.UnanimousBased.decide(UnanimousBased.java:107)
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:206)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.cloudfoundry.identity.api.web.ContentTypeFilter.doFilter(ContentTypeFilter.java:64)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:131)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.cloudfoundry.identity.api.web.CorsFilter.doFilterInternal(CorsFilter.java:37)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:722)
------------------------------------------------------------------------------------
似乎/api无法从身份验证上下文中检索用户marissa的身份,因为它只获取匿名用户(在localhost上运行所有三个应用程序将显示“从安全http会话检索marissa”)


我想知道在不同的域上配置UAA及其示例的正确方法是什么。

看起来像是从您的浏览器跨站点请求保护?在现代浏览器中,您可以添加,例如使用过滤器(Tomcat附带了一个内置的过滤器,您只需使用正确的主机名和路径来启用它)。演示应用确实试图解决这个问题,但是
CorsFilter
中有一个bug。已修复。

看起来像是从浏览器跨站点请求保护?在现代浏览器中,您可以添加,例如使用过滤器(Tomcat附带了一个内置的过滤器,您只需使用正确的主机名和路径来启用它)。演示应用确实试图解决这个问题,但是
CorsFilter
中有一个bug。修正。

您似乎试图使用斜杠“/”为问题添加格式。尝试单击编辑窗口上方的橙色矩形问号以获取有关格式设置的帮助。除此之外,还有什么方法可以使调试转储更简洁?我不认为很多人会想阅读所有这些内容。似乎你正试图使用斜杠“/”为你的问题添加格式。尝试单击编辑窗口上方的橙色矩形问号以获取有关格式设置的帮助。除此之外,还有什么方法可以使调试转储更简洁?我不认为很多人会想阅读所有这些内容。我在/api应用程序中看到一个CORS过滤器,它将Access Control Allow Origin头设置为*并过滤所有传入的请求。这就是你说的吗?对不起,我错过了堆栈跟踪中的
CorsFilter
。所以不是这样。在我看来,客户端根本没有发送访问令牌。如果JavaScript中有问题,则可能在库中。我看看我能不能复制。我明白了,它和CORS有关。CORS客户端需要能够发送选项请求,以确定他们是否可以使用GET(等)进行后续操作,/app示例没有显式处理选项,因此它只是重定向到UAA登录。Anwswer修正了。谢谢你的回答Dave!因此,如果我理解正确,我需要找到一种方法将jso请求方法更改为OPTIONS,或者只是在CORS过滤器中检查request method==OPTIONS的部分?不,我认为CORS客户端需要发送选项。您需要确保服务器响应(通过使用我链接到的提交进行修补,或使用“开发”分支的新版本)。我在/api应用程序中看到一个CORS过滤器,它将访问控制允许源标题设置为*并过滤所有传入的请求。这就是你说的吗?对不起,我错过了堆栈跟踪中的
CorsFilter
。所以不是这样。在我看来,客户端根本没有发送访问令牌。如果JavaScript中有问题,则可能在库中。我看看我能不能复制。我明白了,它和CORS有关。CORS客户端需要能够发送选项请求,以确定他们是否可以使用GET(等)进行后续操作,/app示例没有显式处理选项,因此它只是重定向到UAA登录。Anwswer修正了。谢谢你的回答Dave!因此,如果我理解正确,我需要找到一种方法将jso请求方法更改为OPTIONS,或者只是在CORS过滤器中检查request method==OPTIONS的部分?不,我认为CORS客户端需要发送选项。您需要确保服务器响应(通过使用我链接到的提交进行修补,或者使用“开发”分支的新构建)。