【发布时间】:2019-08-16 23:50:10
【问题描述】:
至少有两种方法可以将 Spring bean 放入上下文配置中:
- 在配置类中用
@Bean声明一个方法。 - 将
@ComponentScan放在配置类中。
我原以为这两种方法在生成的 Spring bean 方面没有区别。
不过,我找到了一个例子来说明区别:
// UserInfoService.java
public interface UserInfoService
{
@PreAuthorize("isAuthenticated()")
String getUserInfo ();
}
// UserInfoServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy({
@ContextConfiguration(classes = TestSecurityContext.class),
@ContextConfiguration(classes = UserInfoServiceTest.Config.class)
})
public class UserInfoServiceTest
{
@Configuration
public static class Config
{
@Bean
public UserInfoService userInfoService ()
{
return new UserInfoServiceImpl();
}
}
@Autowired
private UserInfoService userInfoService;
@Test
public void testGetUserInfoWithoutUser ()
{
assertThatThrownBy(() -> userInfoService.getUserInfo())
.isInstanceOf(AuthenticationCredentialsNotFoundException.class);
}
@Test
@WithMockUser
public void testGetUserInfoWithUser ()
{
String userInfo = userInfoService.getUserInfo();
assertThat(userInfo).isEqualTo("info about user");
}
以上代码是测试服务UserInfoService中的安全注解。但是,它将在testGetUserInfoWithoutUser() 上失败。原因是 bean userInfoService 没有被 Spring Security 代理。因此,调用userInfoService.getUserInfo() 并没有被注解@PreAuthorize("isAuthenticated()") 阻塞。
但是,如果我用@ComponentScan 替换@Bean 注释,一切都会开始工作。也就是说,bean userInfoService 将被代理,调用 userInfoService.getUserInfo() 将被 @PreAuthorize 注释阻止。
为什么@Bean 和@ComponentScan 之间的方法不同?我错过了什么吗?
【问题讨论】:
-
如果使用
@Bean,工厂方法不应该也用@PreAuthorize注解吗?
标签: java spring spring-security spring-test