我们使用Spring Security OAuth2保护我们的REST服务(用于服务器到服务器通信,不涉及用户)。但是,当您尝试访问浏览器中的受保护资源时,它将显示:
<oauth>
<error_description>
An Authentication object was not found in the SecurityContext
</error_description>
<error>unauthorized</error>
</oauth>
我们希望这是我们自己选择的自定义页面。有办法吗?
设置“拒绝访问”页面不起作用。首先,它需要定义一个登录页面,我们没有,因为这是一个纯服务器到服务器的通信。另一个原因是,这个属性自Spring 3.0..或类似的版本以来就被弃用了。
无论如何...调试了我进入OAuth错误处理的方式。发现响应似乎以某种方式丰富了我在错误页面上看到的信息。显然根本没有完成页面渲染,所以看起来没有错误页面可以替换...?!
至少我们想隐藏我们使用OAuth的事实,如果我们不能有一个“真实”的页面,只显示一个基本的“拒绝”文本。因此,也许我必须扩展Spring Security处理程序或添加自定义过滤器来修改响应?!
或许可以重定向到我们的错误页面?
谢谢
编辑
对于我们当前的设置,请在此处检查我的其他SO问题
我也不得不删除oauth细节,我的解决方案是实现我自己的OAuth2ExceptionRenderer。
package org.some.nice.code;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.ResponseEntity;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.security.oauth2.provider.error.OAuth2ExceptionRenderer;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.ServletWebRequest;
public class HeaderOnlyOAuth2ExceptionRenderer implements OAuth2ExceptionRenderer
{
private final Log logger = LogFactory
.getLog(MyOAuth2ExceptionRenderer.class);
public void handleHttpEntityResponse(HttpEntity<?> responseEntity,
ServletWebRequest webRequest) throws Exception
{
if (responseEntity == null)
{
return;
}
HttpInputMessage inputMessage = createHttpInputMessage(webRequest);
HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest);
logger.info("filtering headers only...");
if (responseEntity instanceof ResponseEntity
&& outputMessage instanceof ServerHttpResponse)
{
((ServerHttpResponse) outputMessage)
.setStatusCode(((ResponseEntity<?>) responseEntity)
.getStatusCode());
}
HttpHeaders entityHeaders = responseEntity.getHeaders();
if (!entityHeaders.isEmpty())
{
outputMessage.getHeaders().putAll(entityHeaders);
}
}
private HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest)
throws Exception
{
HttpServletRequest servletRequest = webRequest
.getNativeRequest(HttpServletRequest.class);
return new ServletServerHttpRequest(servletRequest);
}
private HttpOutputMessage createHttpOutputMessage(
NativeWebRequest webRequest) throws Exception
{
HttpServletResponse servletResponse = (HttpServletResponse) webRequest
.getNativeResponse();
return new ServletServerHttpResponse(servletResponse);
}
}
那么您必须在您的spring上下文中引用它
<bean id="oauthAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
<property name="realmName" value="theRealm" />
<property name="exceptionRenderer" ref="headerOnlyExceptionRender" />
</bean>
<bean id="clientAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
<property name="realmName" value="theRealm/client" />
<property name="typeName" value="Basic" />
<property name="exceptionRenderer" ref="headerOnlyExceptionRender" />
</bean>
<bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler">
<property name="exceptionRenderer" ref="headerOnlyExceptionRender" />
</bean>
<bean id="headerOnlyExceptionRender" class="org.some.nice.code.HeaderOnlyOAuth2ExceptionRenderer"/>
希望有帮助。
问题内容: 我从Nexus存储库中检出了代码。我更改了帐户密码,并在文件中正确设置了密码。在执行时,我收到错误消息,说明它尝试从该存储库下载文件。 任何想法如何解决此错误?我在Maven 3.04中使用Windows 7 问题答案: 这里的问题是所使用的密码出现错字错误,由于密码中使用了字符/字母,因此很难识别。
我在这里遵循 JWT 夸克指南。我想在不允许用户组访问 API 时发送自定义响应。 这是指南中显示的示例。 我如何知道请求是否未经授权,以便我可以发送自定义响应。
以下是AI学校在sketch2code应用程序上提供的教程(链接:https://aischool.microsoft.com/en-us/services/learning-paths/sketch2code/sketch2code-lab/train-an-object-detection-model) 我已将我的训练密钥粘贴到程序中。cs文件,当我运行“dotnet run”命令时,它给出以
我没有正确安装吗?我忽略了什么?
我的代码:GoogleCredential凭据 credential.refreshToken() 错误日志: 创建服务号的步骤: 我在凭据中的oauth 2.0中创建了一个Web应用程序 然后我用客户端ID创建了一个服务号 现在我正在使用这个服务号和从它生成的p12证书来验证和创建Google凭据的对象 一旦刷新令牌,我就给了我401例外。 在这种情况下,任何帮助都会受到感激
我们有一个托管在GCP中的应用程序,它使用GSuite API将用户从GSuite同步到我们的应用程序,并使用服务帐户将用户从GSuite同步到我们的应用程序,反之亦然。它过去工作得很好,直到最近我们的一些客户开始面临问题。 我们开始得到 401未经授权。客户端未经授权使用此方法检索访问令牌,或者客户端未被授权使用任何请求的作用域 我们的应用程序和授予的权限列表都没有更改。以下是授予的api访问权