2016-08-28 17 views
2

Spring Securityの実装で定義されたユーザー権限に従って、JSP/JSTLのフィールドを非表示にするのは簡単でした。 1つは簡単に次のように書くことができます:Spring Securityを使用したJSON REST API

<%-- Assume message.title requires no privilege --> 
<c:out value="${message.title}" /> 

<%-- Assume message.text requires PRIV_READ_MESSAGE --> 
<security:authorize ifAllGranted="PRIV_READ_MESSAGE"> 
    <c:out value="${message.text}" /> 
</secrurity:authorize> 

私の質問は、JSPを使用しない場合にこれを行う方法です。私の将来のプロジェクトでは、Angular JS、AJAXリクエスト、JSONレスポンスでプレーンなHTMLファイルを使いたいと思っています。例えば

、私はこのようなメッセージを返すためにAPIを作成することがあります。

GET /api/v1/message/{msgId} 

ユーザーが権限PRIV_READ_MESSAGEを持っていない場合は、このAPIのJSONレスポンスは次のようになります:

{ 
    "messageId": 123, 
    "title": "Sample Message 101" 
} 

ユーザーがその権限を持っている場合は、このAPIのJSON応答は以下のようになります。

{ 
    "messageId": 123, 
    "title": "Sample Message 101", 
    "text": "Message Body will be included..." 
} 

私は、次の春のコントローラを実装しましたと仮定すると:私はログインしているユーザー十分な権限を持っているか、いない場合/他の順序で私のコントローラメソッドには、チェックする場合は追加しない

@RequestMapping(value = "api/v1/message/{messageId}", method = RequestMethod.GET) 
public ResponseEntity<Message> getMessage(@PathVariable Long messageId) { 
    // use some magic code to fetch Message from DB 
    Message message = null; 

    return new ResponseEntity<>(message, HttpStatus.OK); 
} 

。ユーザー権限に従ってJSONレスポンスフィールドをどこかにフィルタリングできますか?

ThreadLocal変数を使用して現在のユーザーの権限を格納していると仮定できます。

答えて

1

あなたはジャージー(2.16+)を使用することができます場合は、あなたの問題のためのアウトオブボックスソリューションがあります: https://jersey.java.net/documentation/latest/entity-filtering.html#ef.security.annotations http://blog.dejavu.sk/2015/02/04/jerseys-entity-filtering-meets-jackson/

が、私はまだそれを試していないが、それは有望に見えます...

春(ジャージーなし)はどうですか? Spring Security/MVCの同様のメカニズムに関する情報はまだ見ていません... Springセキュリティフィルタ(デフォルト)は、Springによって管理されていないため、エンティティに適用できません。 ただし、この使用AOPとAspectJのを実装しようとすることができます:

https://github.com/spring-projects/spring-security/issues/3250

:そこ機能のようなもののためのgithubの問題だったが、私は状況が何であるかを知らない

https://stackoverflow.com/a/31522654/1545775

今やSpring Securityで(余分な設定をせずに)できるのは、エンティティリストのフィルタリング(Spring Securityの役割に基づく)です。セキュリティ保護されたメソッド(例:リポジトリメソッド)で@PostFilterアノテーションを使用してください。しかし、このソリューションを使用する場合は、より大きなデータセットを使用する際のパフォーマンスの問題を認識する必要があります。

関連する問題