我刚刚从spring-security 5.0.x升级到5.1.3,并在部署容器内时发现我的服务没有从spring-security获取经过身份验证的用户主体。
相反,好像spring-webmvc实例化了我的用户主体的另一个实例,但是没有spring-security提供的所有用户和LDAP详细信息。
我从Spring https://github.com/spring-projects/spring-security/issues/3771找到了一条消息,该消息似乎很相关,但是它说我需要从旧的AuthenticationPrincipalArgumentResolver
迁移到新的消息,但是我没有在任何地方明确使用它。
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@Controller
public class MyService {
@RequestMapping(value = "endpoint1",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String myEndpoint(
@AuthenticationPrincipal(errorOnInvalidType = true) CustomUser user) {
我什至把errorOnInvalidType
放在那里,但无济于事。
我还尝试根据文档https://docs.spring.io/spring-security/site/docs/5.1.3.RELEASE/api/
创建自定义AuthenticationPrincipal
注释
看起来AuthenticationPrincipalArgumentResolver
并没有完成工作,但是从调试中我看不到升级版本和旧的不赞成使用的版本(都在spring-security-web
中)
相反,在创建不需要的空主体时,我在堆栈中看到很多spring-webmvc
类,诸如HandlerMethodArgumentResolverComposite
之类的东西,所以在我看来,我不小心删除了其中的关键部分config-批注或jar或实现。
谁能指出我的错误?
答案 0 :(得分:0)
好吧,我发现了如何通过手动创建AuthenticationPrincipal
bean来强制Spring解决AuthenticationPrincipalArgumentResolver
的问题。
贷记AuthenticationPrincipal is empty when using EnableWebSecurity