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

时间:2017-01-11 17:08:52

标签: 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

@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
    }
}

Foo服务

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

    @Autowired
    FooRepository fooDao;

    @Override
    public Foo getFoo() {
        return fooDao.getFoo();
    }
}

安全配置

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter { ... }

2 个答案:

答案 0 :(得分:0)

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

尝试移动@PreAuthorize注释以仅安装view方法。

同样基于您的评论,我发现您的问题可能是您正在使用两个不同的bean实例。检查您是否没有复制上下文文件中的定义。

答案 1 :(得分:0)

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