私はSpring-data-restを使用していくつかのエンティティを公開しており、Spring表現言語を使用してアクセス制御を設定し、ユーザーが自分に属しているエンティティのみを操作できるようにします。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);
...
}
1
(プリンシパルのユーザー名にこのIDが含まれています)のユーザーとして認証された場合、DELETE /users/1
を呼び出すと、次の例外が発生します。
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に基づいています。私はここで何が欠けているのか誰かが指摘できますか?
EDIT: すべてのメソッドがリポジトリに追加されました。これらのメソッドは相互接続されているように見えます。
@Override
@PreAuthorize("#user.getId() == authentication.getName()")
void delete(@RequestParam(name="user", required=true)User user);
.....
あなたが持っている:あなたはid
がprivate
はそう、あなたのコードは、ユーザーIDを取得するためのパブリックメソッドを呼び出す必要があることに注意しなければならないので、それはこのようなものでなければならUser
あなたのクラスで
ありがとうございました。しかし、今私はプリンシパルにアクセスできません: '原因:org.springframework.expression.spel.SpelEvaluationException:EL1004E:メソッド呼び出し:メソッドgetUsername()がjava.lang.String型で見つかりません' – Smajl
そして、 – Smajl
私はあなたがプリンシパル – Hasson