【发布时间】:2019-03-21 13:35:32
【问题描述】:
我的 SpringBoot 服务器 REST API 出现问题。事实上,我创建了一个自定义安全表达式来检查是否允许特定用户访问资源(这不是角色)。
所以我的类扩展了 SecurityExpressionRoot 并实现了 MethodSecurityExpressionOperations。一切正常(方法调用成功)但我不能使用我的 UserRepository 属性:它是空的。
所以我的问题是,如何能够在 自定义安全表达式 中使用 UserRepository 实例?
提前致谢!
public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
public CustomMethodSecurityExpressionRoot(Authentication authentication) {
super(authentication);
}
@Inject
private UserRepository userRepository; // This is always null
@Override
public void setFilterObject(Object o) { }
@Override
public Object getFilterObject() { return null; }
@Override
public void setReturnObject(Object o) { }
@Override
public Object getReturnObject() { return null; }
@Override
public Object getThis() { return null; }
public boolean isValidated() {
UserDetails principalUser = (UserDetails)authentication.getPrincipal();
Optional<User> userFromDatabase = userRepository.findOneByLogin(principalUser.getUsername()); // Username is found here
return userFromDatabase.map(user -> { // Not executed because userFromDatabase is null :/
return true;
}).orElseThrow(() -> {
return new UsernameNotFoundException("user was not found in the database");
});
}
}
【问题讨论】:
-
您的
CustomMethodSecurityExpressionRoot必须是弹簧组件!并注入您的UserRepository,您可以使用@Autowired -
@TinyOS 感谢您(非常)快速的回复!我试图在类的顶部添加
@Component并将@Autowired设置为UserRepository,并且在启动我的服务器时出现异常:Error creating bean with name 'methodSecurityConfig': **Injection of autowired dependencies failed; nested exception is java.lang.RuntimeException: Could not postProcess(对不起,我对SpringBoot 非常陌生,来自Node.JS:p ) -
我对 SecurityExpressionRoot 不熟悉,但这感觉不是正确的方法。此时用户应该已经在 UserDetails 中,因此不应在该表达式中调用数据库。查找 DaoAuthenticationProvider 和 DaoAuthenticationProvider(spring 安全类)以获取有关如何执行此操作的一些指示。
-
谢谢,我使用了这个“hack”,因为 UserDetails 中的用户信息没有更新(似乎用户信息没有从数据库中刷新)。我要去检查
DaoAuthenticationProvider谢谢你的提示!
标签: java spring-boot spring-security