Spring Data Rest: セキュリティベースの投影 質問する

Spring Data Rest: セキュリティベースの投影 質問する

現在のバージョンを使用していますスプリングデータレストそしてスプリングデータ JPAそして次のエンティティを持ちます:

public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String password;
    private String email;
   ...getter/setter methods...
}

私も使っていますSpring Security

私のユーザーリポジトリ:

   @RepositoryRestResource(
     collectionResourceRel = "user", 
     path = "user", 
    excerptProjection = UserSimpleProjection.class)
public interface UserRepository extends PagingAndSortingRepository<User, Long> {

}

例えば:

  • ユーザー1がログインしています
  • ユーザー1のリクエストhttp://localhost:8080/user/1- すべてのフィールドが表示されます
  • ユーザー 1 の要求http://localhost:8080/user/2-idname表示されています。

私はジャクソンと一緒にさまざまな解決策を試しましたが、どれも私の問題を解決しませんでした。

  • の使用JsonViewObjectMapper:ログインしたユーザーに応じてビューを変更する方法が見つかりませんでした
  • 説明したように、さまざまなジャクソンフィルターを実装しましたここ同じ問題があり、ObjectMapper異なるリクエストの設定を変更する方法が見つかりませんでした。

そして私は見つけた予測

投影を作成しました:

@Projection(name = "simple", types = User.class)
public interface UserSimpleProjection {

    public Long getId();

    public String getName();
}

そしてもう一つの詳しい例:

@Projection(name = "detailed", types = User.class)
public interface UserDetailProjection extends UserSimpleProjection{

    public String getEmail();
}

これまでのところ順調で、リクエストに応じて異なる結果が得られます。

Spring Security に応じて投影を自動的に切り替えたり、異なるロールに対して異なる投影を制限したりする方法はありますか?

ベストアンサー1

セキュリティ チェック付きのサービス メソッドを呼び出すプロジェクションに「仮想」値プロパティを追加できます。

@Projection(name = "detailed", types = User.class)
public interface UserDetailProjection extends UserSimpleProjection{

    @Value("#{@userService.checkAccess(target)? target.email : null}")
    public String getEmail();
}

電子メールを公開する必要がある場合、または単に適切なものをスローする必要がある場合に、カスタムUserServiceコンポーネントが返される場所。true@PreAuthorizecheckAccess(..)AccessDeniedException

targetSpEL 内のプロパティには、Spring-DATA によって提供される元のオブジェクトが保持されることに注意してください。

おすすめ記事