現在のバージョンを使用していますスプリングデータレストそしてスプリングデータ 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
-id
がname
表示されています。
私はジャクソンと一緒にさまざまな解決策を試しましたが、どれも私の問題を解決しませんでした。
- の使用JsonView
ObjectMapper
:ログインしたユーザーに応じてビューを変更する方法が見つかりませんでした - 説明したように、さまざまなジャクソンフィルターを実装しましたここ同じ問題があり、
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
@PreAuthorize
checkAccess(..)
AccessDeniedException
target
SpEL 内のプロパティには、Spring-DATA によって提供される元のオブジェクトが保持されることに注意してください。