当前位置: 首页 > 知识库问答 >
问题:

如何自定义@preauthorize(“isauthenticated()”)返回的http状态?

岑彬炳
2023-03-14

在Spring Boot控制器中,我使用@preauthorize(“isauthenticated()”)检查用户是否登录(使用基本auth+jsessionid)。
但是如果用户没有登录,即他们没有经过身份验证,控制器返回403禁止
根据我对身份验证与授权的了解,401用于身份验证,而403用于授权。

根据我的理解,@preauthorize()总是检查用户的授权(顾名思义),但是有什么方法可以根据我们传递给它的参数自定义它,即isauthenticated()

我知道还有另一种解决方案:在configure(HttpSecurity,HttpSecurity)中使用基于URL的安全配置,但如果我不想这样做,该怎么办。

有什么想法请。

共有1个答案

饶滨海
2023-03-14

当您用@pre/postauthorize注释方法A时,spring将为这样的对象创建代理,对这样的方法的每次调用都将通过代理(如果对象在spring上下文中)。

@pre/postauthorize的代理将从注释中计算表达式(这里很复杂),如果是真的,则传递请求父(到real方法),如果不是,则抛出AccessDaniedException。您也可以在方法A中自己抛出这样的异常,效果也是一样的。这一切都是关于@pre/postauthorize是如何工作的,这里不再有魔力了!

但这还不是故事的结尾!

如果没有,那么ExceptionTranslationFilter将委托给AuthenticationEntryPoint,它将处理这种情况(重定向到登录页面,询问http basic...,等等)。

注意:ExceptionTranslationFilter将重新抛出exception,如果有AuthenticationExceptionAccessDeniedException以外的异常,可能会显示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