【发布时间】:2017-10-24 11:01:32
【问题描述】:
我正在使用 Spring-data-rest 公开一些实体,我想使用 Spring 表达式语言配置访问控制并进行预授权,以便用户只能操作属于他的实体。
我的主体对象在其用户名(字符串)中包含用户 ID,并且用户有一个属性 ID(长):
@Entity
@Table(name = "users")
@Getter
@Setter
public class User {
@Id
@Column(name = "user_id", nullable = false, updatable = false)
private Long id;
...
}
我的存储库如下所示:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Override
@PreAuthorize("hasRole('ROLE_ADMIN')")
User findOne(Long id);
@Override
@PreAuthorize("#user.id == principal.username")
void delete(User user);
...
}
但是,当以 id 1 的用户身份进行身份验证时调用 DELETE /users/1(主体在其用户名中包含此 id),我得到以下异常:
java.lang.IllegalArgumentException: Failed to evaluate expression '#user.id == principal.username'
...
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null
我的表达基于官方Spring documentation。有人能指出我在这里缺少什么吗?
编辑: 我在我的存储库中添加了所有方法,因为它们似乎是相互关联的。
【问题讨论】:
标签: java spring-boot spring-security spring-el