Spring Boot 和 Spring Security 在有效登录时返回 404

当我通过自定义 bean 激活 Spring Security 时,@PreAuthorize("@mySecurity.check(#car)")有效请求(检查返回 true)将以 404 结束,无效请求将以 200 结束。没有 PreAuthorize 一切正常。


授权是通过JWT完成的,并且授予的权限设置正确。


当我单步执行调试器时,预授权检查正常工作,返回 true 或 false。


我启用了以下功能:


@Configuration

@EnableWebSecurity

@EnableGlobalMethodSecurity(prePostEnabled = true)

public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

Rest 控制器使用以下注释实现该方法


    @PreAuthorize("@mySecurity.check(#car)")

    public List<Driver> getAllVersions(String car) {

没有安全检查的请求看起来像


2019-09-30 13:34:22.306 DEBUG 26204 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Completed 200 OK

2019-09-30 13:34:42.042 DEBUG 26204 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : GET "/api/v1/car/foobar", parameters={}

...

2019-09-30 13:34:42.049 DEBUG 26204 --- [nio-8080-exec-4] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]

2019-09-30 13:34:42.050 DEBUG 26204 --- [nio-8080-exec-4] m.m.a.RequestResponseBodyMethodProcessor : Writing [{

  "id": "hi",

  "name": "hi",

  "isActive": false

}]

2019-09-30 13:34:42.052 DEBUG 26204 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Completed 200 OK

当激活 PreAuthorize 并执行有效请求时,它似乎部分工作。


2019-09-30 13:44:22.597 DEBUG 7400 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : GET "/api/v1/car/foobar", parameters={}

...

2019-09-30 13:44:28.912 DEBUG 7400 --- [nio-8080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Selected '*/*' given [*/*]

2019-09-30 13:44:28.938 DEBUG 7400 --- [nio-8080-exec-1] o.s.w.servlet.view.InternalResourceView  : View name '/api/v1/car/foobar2', model {configurationVersionList=[{

  "id": "bar",

  "name": "bar",

  "isActive": false

}, {

  "id": "foo",

  "name": "foo",

  "isActive": false

}]}



繁星点点滴滴
浏览 75回答 2
2回答

白衣非少年

您的控制器是否带有注释@RestController?如果没有,你需要@ResponseBody 在你的方法上添加注释@PreAuthorize("@mySecurity.check(#car)")@ResponseBodypublic List<Driver> getAllVersions(String car) {如果没有这个弹簧,则会尝试加载不存在的实际视图 - 404或者缺少 PathParam 注释public List<Driver> getAllVersions(@PathParam("ParamName") String car)过去,我在实现的接口上而不是直接在类上添加注释时遇到了一些问题。PreAuthorize 做了一些额外的“魔法”,只是一个想法

qq_遁去的一_1

尝试将 @ResponeBody 作为控制器类中的方法
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java