我在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");
});
}
}
3条答案
按热度按时间eqqqjvef1#
如果不能使类成为spring组件,最好的方法是在构造函数中也传递
UserRepository
,并将其作为参数从服务传递。vvppvyoh2#
CustomMethodSecurityExpressionRoot
必须是Spring组件,并使用@Autowired
注入UserRepository
。bksxznpy3#
也许您可以应用链接https://medium.com/@islamboulila/how-to-create-a-custom-security-expression-method-in-spring-security-e5b6353f062f中所做的事情。在方法安全配置中,她将应用程序上下文传递给方法安全表达式处理程序。在方法安全表达式处理程序内部,她从应用程序上下文获取UserService bean,并通过setter传递给CustomMethodSecurityExpressionRoot。