SpotBugs标记Spring构造注入存安全风险,求更优注入方案
解决方案
一、关于依赖注入的最优实现
你当前使用的构造函数注入本身就是Spring官方推荐的最优依赖注入方式,而且在Spring 4.3及以上版本中,当类只有一个带参数的构造函数时,完全不需要添加@Autowired注解——Spring会自动识别并完成依赖注入。
这种方式完全支持在集成测试中注入Mock Bean:
- 可以用Mockito的
@Mock注解创建Mock实例,再通过@InjectMocks注入到CountryServiceImpl中; - 也可以在测试专用的Spring配置类中,定义
UserSessionService的Mock Bean,Spring会自动将其注入到目标类中。
你担心的“无法注入mock beans”的问题并不存在,构造注入是完全适配测试场景的。
二、解决SpotBugs的可变对象引用警告
SpotBugs的警告是因为它判定UserSessionService是可变对象,直接存储外部引用存在被篡改的风险。你可以根据实际情况选择以下处理方式:
1. 将UserSessionService设计为不可变类
如果UserSessionService是你可控的自定义类,最彻底的解决方式是把它改成不可变类:
- 所有成员变量用
final修饰; - 不提供任何修改对象状态的方法;
- 确保所有返回的内部对象也是不可变的。
改成不可变类后,SpotBugs会判定它不存在可变风险,警告自动消失。
2. 存储对象副本(如果支持复制)
如果无法将UserSessionService改成不可变类,但该类支持复制(比如实现了Cloneable接口,或者提供了拷贝构造函数),可以在构造函数中创建对象的副本存储:
public CountryServiceImpl(final UserSessionService userSessionService) { // 假设UserSessionService有拷贝构造函数 this.userSessionService = new UserSessionService(userSessionService); }
3. 使用包装类封装(针对第三方不可修改类)
如果UserSessionService是第三方类,无法修改其代码,可以自定义一个不可变包装类,只暴露安全的只读方法,屏蔽修改状态的操作:
public class ImmutableUserSessionServiceWrapper implements UserSessionService { private final UserSessionService delegate; public ImmutableUserSessionServiceWrapper(UserSessionService delegate) { this.delegate = delegate; } // 只实现需要的只读方法 @Override public String getCurrentUserId() { return delegate.getCurrentUserId(); } // 屏蔽所有修改状态的方法 @Override public void updateUserSession(String sessionId) { throw new UnsupportedOperationException("不允许修改会话状态"); } }
然后在构造注入时传入包装后的实例:
public CountryServiceImpl(final UserSessionService userSessionService) { this.userSessionService = new ImmutableUserSessionServiceWrapper(userSessionService); }
4. 抑制SpotBugs警告(下策)
如果你能确保UserSessionService实例是Spring容器中的单例,且不会被不可信代码修改,可以通过SpotBugs的注解直接抑制该警告:
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @SuppressFBWarnings("EI_EXPOSE_REP") public CountryServiceImpl(final UserSessionService userSessionService) { this.userSessionService = userSessionService; }
注意:这种方式仅在你能完全确认安全的情况下使用,不推荐作为常规解决方案。
内容的提问来源于stack exchange,提问作者user1034461
相关产品推荐
相关产品推荐

