我想通过注释方法而不是在Spring安全配置bean中指定ANT匹配器来声明我的Spring @RestController
的安全设置。
我写了这样的东西(我正在使用Kotlin和Spring WebFlux):
@RestController
open class MyController {
@GetMapping("/public")
open suspend fun public() {
...
}
@GetMapping("/private")
@RolesAllowed("user")
open suspend fun public() {
...
}
}
我还在我的安全配置类中启用了全局方法安全性:
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = true,
jsr250Enabled = true
)
我希望第一种方法可以被任何人(甚至是匿名用户)调用,而第二种方法只能由具有指定角色的经过身份验证的用户调用。
但是当我通过匿名用户调用私有方法时,出现了500个服务器错误和堆栈跟踪:
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:379) ~[spring-security-core-5.3.0.RELEASE.jar:5.3.0.RELEASE]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
我想返回更相关的错误代码,例如401或403。