我的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");
});
}
}
答案 0 :(得分:0)
如果不能使类成为spring组件,最好的方法是在构造函数中也传递UserRepository
并将其作为参数从服务传递。