在Spring Boot控制器中,我使用@preauthorize(“isauthenticated()”)
检查用户是否登录(使用基本auth+jsessionid
)。
但是如果用户没有登录,即他们没有经过身份验证,控制器返回403禁止
。
根据我对身份验证与授权的了解,401
用于身份验证,而403
用于授权。
根据我的理解,@preauthorize()
总是检查用户的授权(顾名思义),但是有什么方法可以根据我们传递给它的参数自定义它,即isauthenticated()
?
我知道还有另一种解决方案:在configure(HttpSecurity,HttpSecurity)
中使用基于URL的安全配置,但如果我不想这样做,该怎么办。
有什么想法请。
当您用@pre/postauthorize
注释方法A时,spring将为这样的对象创建代理,对这样的方法的每次调用都将通过代理(如果对象在spring上下文中)。
@pre/postauthorize
的代理将从注释中计算表达式(这里很复杂),如果是真的,则传递请求父(到real方法),如果不是,则抛出AccessDaniedException。您也可以在方法A中自己抛出这样的异常,效果也是一样的。这一切都是关于@pre/postauthorize
是如何工作的,这里不再有魔力了!
但这还不是故事的结尾!
如果没有,那么ExceptionTranslationFilter
将委托给AuthenticationEntryPoint
,它将处理这种情况(重定向到登录页面,询问http basic...,等等)。
注意:ExceptionTranslationFilter
将重新抛出exception,如果有AuthenticationException
或AccessDeniedException
以外的异常,可能会显示500:(
您的问题可能是另一个问题看看Spring Security anonymous 401而不是403
@GetMapping(value = "/test/ok")
public String getOk() {
try {
myService.securedMethod();
return "ok";
} catch (Exception e) {
log.info("AccessDeniedException suppressed not rethrowing :(", e);
return "error";
}
}
正确重译:):
@GetMapping(value = "/test/ok")
public String getOk() {
try {
myService.securedMethod();
return "ok";
} catch (AccessDeniedException e) {
throw new MyException(e); //public MyException(Throwable cause)
}
}
我正在处理WebAPI 2中的一个服务,endpoint当前返回一个<code>IHttpActionResult<code>。我想返回一个状态代码,但由于它不在枚举中,我不知道如何发送它,因为所有构造函数都需要一个参数 目前,我正在返回<code>BadResult(消息),但返回<code>422
在Spring MVC@RequestMapping注释中,我返回JSP页面名称作为结果。这将返回HTTP状态代码200OK。如何将此状态代码更改为创建的201? @ResponseStatus不起作用。另外,HttpServletResponse也不能工作,因为我只需要返回自定义JSP页面。
我考虑在项目中使用fluent-http。 所以我尝试注入: 返回正确的字符串,但似乎没有使用状态代码。在这两种情况下,响应都有一个代码HTTP200。 注意:我发现一些状态代码是预先实现的: null
我正在使用 格雷德尔: 控制器 验证器类 控制器建议 如果我从验证器中抛出customException,那么尽管我有相应的controllerAdvice, 总是,我收到400个坏的请求,因为我有一个controllerAdvice总是返回400。 我想在这里实现的是,有没有可能返回带有状态代码的customException或者有没有从Validator返回不同的状态代码?我在StackOve
如果我的WebClient请求收到HTTP 4xx或5xx错误,我需要进行另一次HTTP调用。 对于这种情况,正确的做法是什么?
我们正在使用spring和Spring-Security-3.2。最近,我们向RESTAPI添加了注释@preauthorize(以前是基于URL的)。 我们已经有了用-@ControllerAdvice和自定义的PermissionEvaluator注释的全局异常处理程序,除了错误消息之外,其他一切都正常工作。 是否可能抛出一个包含权限名称的异常,所以最终的错误消息应该是“Access Is d