我在使用Spring Security和一些URL时遇到了麻烦。
这是方案: 春季启动2.1.0 Spring Security 5.1.1
我正在使用带有登录名等的标准安全配置。我还对PreAuthorize
的{{1}}中的RequestMapping
拥有一些角色和权限。没问题一切正常。
该问题出现在某些映射上。我给你看一个例子:
Controller
此URL以PDF格式而不是HTML页面返回报告。
我收到此错误消息:
@RequestMapping(value = "/codigo/{barcode}.pdf")
@ResponseBody
@PreAuthorize("hasAnyRole({'ROLE_ADMIN','ROLE_USER'})")
public void codigo(HttpServletRequest request, HttpServletResponse response, @PathVariable(required = true, name = "barcode") String barcode) {
...
}
如果我添加一些代码来检查安全上下文
AuthenticationCredentialsNotFoundException: An Authentication object was not found in the Security Context
这就是我得到的:
SecurityContext ctx = SecurityContextHolder.getContext();
Logger.getLogger(InformesController.class.getName()).log(Level.WARNING, "Context: {0}", ctx);
我尝试了不同的组合以使一种有效。结果是:
@RequestMapping(value =“ /codigo/{barcode}.pdf”):空身份验证
@RequestMapping(value =“ / codigo / {barcode}”):如果{barcode}为 'something.pdf'(或.txt或其他扩展名)->空 认证
@RequestMapping(value =“ / codigo / {barcode}”):如果{barcode}为 “某事”没事。
我已经在Firefox和Chrome中对此进行了测试,以确保这不是浏览器问题,并且得到了相同的结果。
作为一种变通办法,我正在使用无扩展方法,因为它一直在工作,但是我想知道是否有避免这种情况的方法,或者想知道为什么会发生这种情况。