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

5ssjco0h  于 2023-01-20  发布在  Spring
关注(0)|答案(3)|浏览(101)

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

eqqqjvef1#

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

vvppvyoh

vvppvyoh2#

CustomMethodSecurityExpressionRoot必须是Spring组件,并使用@Autowired注入UserRepository

bksxznpy

bksxznpy3#

也许您可以应用链接https://medium.com/@islamboulila/how-to-create-a-custom-security-expression-method-in-spring-security-e5b6353f062f中所做的事情。在方法安全配置中,她将应用程序上下文传递给方法安全表达式处理程序。在方法安全表达式处理程序内部,她从应用程序上下文获取UserService bean,并通过setter传递给CustomMethodSecurityExpressionRoot。

相关问题