具有 Security EvaluationContextExtensionSupport 的 Spring Data JPA 不起作用
Posted
技术标签:
【中文标题】具有 Security EvaluationContextExtensionSupport 的 Spring Data JPA 不起作用【英文标题】:Spring Data JPA with Security EvaluationContextExtensionSupport not working 【发布时间】:2015-07-30 17:37:34 【问题描述】:我想使用 Spring Data JPA 的安全扩展支持来检查用户的权限并相应地获取一些值。我正在尝试按照here
的指示执行此操作下面是我的代码sn-p
@RepositoryRestResource(collectionResourceRel = "ProductStatus", path = "ProductStatus")
public interface IProductStatusRepository extends CrudRepository<ProductStatusEntity, String>
@Query("SELECT p FROM ProductStatusEntity " +
"?#hasAuthority('ITManager') ? ' ' : ' WHERE ProductStatusCode NOT IN (\'VAL1\',\'VAL2\',\'VAL3\')'")
List<ProductStatusEntity> findStatusesByAuthority();
我确实只通过复制粘贴代码来声明 SecurityEvaluationContextExtension 类和 securityExtension bean。但是,上面的代码仍然不起作用。
我总是得到一个
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ?
我尝试了几个选项来玩弄 ?#、:#、hasRole、hasAuthority 等。似乎没有任何效果。
对此有什么想法吗?
【问题讨论】:
【参考方案1】:这个在经过多次试验和错误后奏效了
@Query("select p from ProductStatusEntity p where p.productStatusCode NOT IN ( ?#hasAuthority('ITManager') ? ' ' : @settings.productStatusExceptions)")
List<ProductStatusEntity> findStatusesByAuthority();
问题似乎是 SpEL 只有在指定了 WHERE 子句时才会被识别..可能这可以改进..不确定..
【讨论】:
以上是关于具有 Security EvaluationContextExtensionSupport 的 Spring Data JPA 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
System.ServiceModel.Security.SecurityNegotiationException:无法为具有权限的 SSL/TLS 安全通道建立信任关系
Spring Security:检查用户是不是具有分层角色的方法