我的Spring Boot服务器REST API出了问题。实际上,我创建了一个自定义安全表达式,以检查是否允许特定用户访问资源(不是角色)。
所以我的类扩展了SecurityExpressionRoot并实现了MethodSecurityExpressionOperations。一切正常(成功调用的方法),但我不能使用我的UserRepository属性:它是null。
所以我的问题是,如何在自定义安全表达式中使用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");
});
}
}
如果你不能使你的类成为spring组件,最好的方法是在构造函数中传递UserRepository
并将其作为参数从服务传递。