向PermissionEvaluator注入Session Bean时实例为null如何解决
问题原因
SessionAuthentication类未被Spring IoC容器托管,类中标注的@Resource依赖注入逻辑不会被执行,这是注入的Session始终为null的根本原因。
Spring的依赖注入能力仅对容器自身创建、管理的Bean生效:其他类中注入能正常生效,是因为这些类本身通过@Component/@Service等构造型注解、或@Bean配置方法被注册到了Spring容器中,容器在实例化这些类时会自动解析、注入所需的依赖。
当前代码中SessionAuthentication既没有添加Spring托管相关注解,也没有在配置类中被注册为Bean,如果你在配置Spring Security权限校验逻辑时是通过new SessionAuthentication()手动创建的实例,这个实例完全脱离Spring容器管理,类上的@Resource注解不会被解析,自然拿不到Session Bean的实例。
修复方法
不要手动new SessionAuthentication实例,将其也注册为Spring容器管理的Bean,使用时直接从容器获取实例即可:
- 你可以选择直接在
SessionAuthentication类上添加@Component注解标记为托管组件,也可以在现有配置类中补充对应的Bean注册逻辑,示例如下:
@Configuration public class SessionConfiguration { @Bean public Session returnSession() { return new Session(); } @Bean public PermissionEvaluator sessionAuthenticationEvaluator() { return new SessionAuthentication(); } }
- 在配置Spring Security全局方法权限时,直接注入容器中已经注册好的
PermissionEvaluator实例使用,不要手动创建实例。容器在创建SessionAuthentication类型的Bean时,会自动把名为returnSession的Session Bean注入到对应的字段中。
额外注意:当前
PermissionEvaluator的实现没有使用传入的认证信息、目标资源标识、权限标识参数,仅判断Session中是否存在用户,会导致所有登录用户默认获得所有资源的访问权限,不符合细粒度授权的设计预期,后续需要补充对应权限判断逻辑。
内容的提问来源于stack exchange,提问作者NorwegianDeveloper005
相关产品推荐
相关产品推荐

