无法访问自定义安全表达式中的UserRepository属性

时间:2019-03-21 13:35:33

标签: java spring-boot spring-security

我的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");
        });
    }
}

1 个答案:

答案 0 :(得分:0)

如果不能使类成为spring组件,最好的方法是在构造函数中也传递UserRepository并将其作为参数从服务传递。