2016-11-28 8 views
3

は、次のように私は2つのエンティティがあるとし、独自のレコードを更新することができますを確認します。認証されたユーザーのみ

@Entity 
public class ClassA { 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @OneToMany 
    private Set<ClassB> classBs = new HashSet<>(); 
} 
@Entity 
public class ClassB { 
    private Long id; 
    private String name; 


    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

つまり、にClassAはClassBののセットが含まれています。 A級更新するのでなどとリソース(休止状態を使用して)DAOで

@RequestMapping(method = RequestMethod.PUT) 
public ClassA update(@RequestBody ClassA a){ 
    // Update code here 
} 

した後に、次のデータベースにClassAクラスを更新するために呼び出される。更新シナリオで

@Override 
public ClassA save(ClassA classA) { 
    sessionFactory.getCurrentSession().saveOrUpdate(classA); 
    return classA; 
} 

場合認証されたユーザーは、ClassBのインスタンスのidを、別のユーザーに属するidに変更します。このユーザーは、ユーザーに属していないオブジェクトを更新するユーザーの停止を防ぐ保護がありません。これを防ぐ方法はありますか?これを防ぐためのベストプラクティスは何ですか(つまり、別のユーザーを更新することを防ぐclassBの詳細)?

答えて

1

Access Control using @PreAuthorize and @PostAuthorizeを参照してください:

アクセス制御

@PreAuthorizeと@PostAuthorizeを使用して、ほとんど明らかに便利な注釈は、メソッドが実際に呼び出されることができるか否かを決定している@PreAuthorizeです。例えば

@PreAuthorize("hasRole('USER')") 
public void create(Contact contact); 

(「連絡先」のサンプル・アプリケーションから)アクセスが唯一の役割「ROLE_USER」を持つユーザーに許可されることを意味します。明らかに、同じことは、従来の構成と必要な役割のための単純な構成属性を使用して簡単に達成できます。しかし、何について:

@PreAuthorize("hasPermission(#contact, 'admin')") 
public void deletePermission(Contact contact, Sid recipient, Permission permission); 

ここでは、実際に現在のユーザーが指定した連絡先の「管理者」権限を持っているかどうかを決定するために式の一部としてメソッドの引数を使用しています。組み込みのhasPermission()式は、以下で説明するように、アプリケーションコンテキストを介してSpring Security ACLモジュールにリンクされています。任意のメソッド引数に式変数として名前でアクセスできます。

0

これはというビジネスロジックと呼ばれます。 Hibernateは、idフィールドがユーザを示すことを意図しているという概念を持っていません。フィールドを任意の値に設定することを止めることはありません。

IDフィールドを変更するこのコードを呼び出すコードでは、idフィールドの制限を認識し、ユーザーが変更できないようにする必要があります。このようなチェックを行うUIとDAOの間にビジネスレイヤーを配置する必要があります。

+0

答えていただきありがとうございます。この場合、コントローラとDAOの間にサービスレイヤーがあるので、その間のロジックを使用するとこれを整理することができます。私は、質問がより多くの質問を自動的に冬眠(またはおそらく春/春のセキュリティ)を可能にすることですあなたのためにこの仕事をしていると思いますか?あるいは、これを行う方法が知られていて、どこかに文書化されていれば。 –

関連する問題