使用PreAuthorize时,Autowired Service在ResponseBody方法中为空

Kyl*_*yle 6 java spring spring-mvc spring-security

我有一个"Foo"控制器自动装配"Foo"服务.

现在,当我向控制器添加PreAuthorize注释时,view方法工作正常,PreAuthorize标记仅授予具有ADMIN权限的用户的访问权限,但ResponseBody方法(getFoo)不能按预期工作.

使用PreAuthorize批注时,getFoo方法无法正确自动装配/实例化fooService对象,该对象的值为null,导致NPE(空指针异常).

问题概述: 当AJAX GET请求调用getFoo方法时,fooService为null(导致NPE).

但是,在注释掉@PreAuthorize时,调用getFoo时fooService不再为null.

...

这是代码:

Foo控制器

@Controller
@RequestMapping("/foo")
@PreAuthorize("hasAuthority(T(com.foo.security.Authorities).ADMIN)")
public class FooController {

    @Autowired
    private FooService fooService;

    @RequestMapping(value = "/view") 
    public String view(@AuthenticationPrincipal Principal principal) {
        return "view";
    }

    @RequestMapping(value = "/getFoo")
    @ResponseBody
    public Foo getFoo() {
        fooService.getFoo(); <- NPE happens here
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo服务

@Service("fooService")
public class FooServiceImpl implements FooService {

    @Autowired
    FooRepository fooDao;

    @Override
    public Foo getFoo() {
        return fooDao.getFoo();
    }
}
Run Code Online (Sandbox Code Playgroud)

安全配置

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter { ... }
Run Code Online (Sandbox Code Playgroud)

小智 5

确保所有带有注释的控制器方法@RequestMapping都没有声明为私有


And*_*res 0

似乎调用服务的线程没有正确的安全角色。

尝试移动@PreAuthorize注释以仅保护view方法。

另外根据您的评论,我发现您的问题可能是您正在使用该 bean 的两个不同实例。检查您是否没有在上下文文件中重复定义。