我有一个" 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 { ... }
答案 0 :(得分:0)
似乎调用该服务的线程没有正确的安全角色。
尝试移动@PreAuthorize
注释以仅安装view
方法。
同样基于您的评论,我发现您的问题可能是您正在使用两个不同的bean实例。检查您是否没有复制上下文文件中的定义。
答案 1 :(得分:0)
确保所有用@RequestMapping
注释的控制器方法都未声明为私有