【问题标题】:Can't access to UserRepository property inside a custom security expression无法访问自定义安全表达式中的 UserRepository 属性
【发布时间】:2019-03-21 13:35:32
【问题描述】:

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

【问题讨论】:

  • 您的CustomMethodSecurityExpressionRoot 必须是弹簧组件!并注入您的UserRepository,您可以使用@Autowired
  • @TinyOS 感谢您(非常)快速的回复!我试图在类的顶部添加@Component 并将@Autowired 设置为UserRepository,并且在启动我的服务器时出现异常:Error creating bean with name 'methodSecurityConfig': **Injection of autowired dependencies failed; nested exception is java.lang.RuntimeException: Could not postProcess(对不起,我对SpringBoot 非常陌生,来自Node.JS:p )
  • 我对 SecurityExpressionRoot 不熟悉,但这感觉不是正确的方法。此时用户应该已经在 UserDetails 中,因此不应在该表达式中调用数据库。查找 DaoAuthenticationProvider 和 DaoAuthenticationProvider(spring 安全类)以获取有关如何执行此操作的一些指示。
  • 谢谢,我使用了这个“hack”,因为 UserDetails 中的用户信息没有更新(似乎用户信息没有从数据库中刷新)。我要去检查DaoAuthenticationProvider谢谢你的提示!

标签: java spring-boot spring-security


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多