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

问题描述 投票:0回答:1

我的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");
        });
    }
}
java spring-boot spring-security
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.