在@Scheduled进程中使用@Query方法

Hip*_*ppo 5 spring-security spring-data spring-boot

说明:

我想一起使用注释@Query,@Scheduled但我找不到办法.

问题是您需要进行身份验证才能@Query在查询中使用当前会话.但是在运行的方法中@Scheduled,没有身份验证.以下是显示问题的堆栈跟踪示例:

java.lang.IllegalArgumentException: Authentication object cannot be null
    at org.springframework.security.access.expression.SecurityExpressionRoot.<init>(SecurityExpressionRoot.java:61)
    at org.springframework.security.data.repository.query.SecurityEvaluationContextExtension$1.<init>(SecurityEvaluationContextExtension.java:108)
    at org.springframework.security.data.repository.query.SecurityEvaluationContextExtension.getRootObject(SecurityEvaluationContextExtension.java:108)
    at org.springframework.data.repository.query.ExtensionAwareEvaluationContextProvider$EvaluationContextExtensionAdapter.<init>(ExtensionAwareEvaluationContextProvider.java:463)
    at org.springframework.data.repository.query.ExtensionAwareEvaluationContextProvider.toAdapters(ExtensionAwareEvaluationContextProvider.java:210)
    at org.springframework.data.repository.query.ExtensionAwareEvaluationContextProvider.access$000(ExtensionAwareEvaluationContextProvider.java:59)
    at org.springframework.data.repository.query.ExtensionAwareEvaluationContextProvider$ExtensionAwarePropertyAccessor.<init>(ExtensionAwareEvaluationContextProvider.java:235)
    at org.springframework.data.repository.query.ExtensionAwareEvaluationContextProvider.getEvaluationContext(ExtensionAwareEvaluationContextProvider.java:107)
    at org.springframework.data.repository.query.ExtensionAwareEvaluationContextProvider.getEvaluationContext(ExtensionAwareEvaluationContextProvider.java:59)
    at org.springframework.data.couchbase.repository.query.StringN1qlBasedQuery.parseSpel(StringN1qlBasedQuery.java:237)
    at org.springframework.data.couchbase.repository.query.StringN1qlBasedQuery.getStatement(StringN1qlBasedQuery.java:293)
    at org.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.execute(AbstractN1qlBasedQuery.java:94)
...
Run Code Online (Sandbox Code Playgroud)

此机制在Spring Boot中自动配置,org.springframework.boot.autoconfigure.security.SecurityDataConfiguration以便能够为经过身份验证的用户查询数据(通过SpEL).

我用的是什么:

  • Spring Boot v1.5.7.RELEASE
  • Spring Boot自动配置 @EnableAutoConfiguration

我想要的是:

我不希望我的@Query方法能够使用SecurityEvaluationContextExtensionSpring Boot提供的方法,因为我没有在我的项目中使用它(没有实体链接到连接的用户).

为此,我想禁用SecurityEvaluationContextExtension自动配置SecurityDataConfiguration.

我尝试了什么:

  • SecurityEvaluationContextExtension在自定义Configuration类中重新定义bean 以返回nullbean(而不是new SecurityEvaluationContextExtension())但我不允许这样做.
  • 排除配置SecurityDataConfiguration但它没有定义为自动配置,它包含在类中SecurityAutoConfiguration:
    • 我不确定我只能排除SecurityDataConfiguration因为它不是AutoConfiguration类.
    • 我不确定SecurityAutoConfiguration从自动配置中排除所有这个类是否是个好主意(因为它还包括其他安全配置).