2016-08-16 8 views
3

Javascriptフロントエンド+ Spring MVCプロジェクト(ユーザー管理の管理Webアプリケーション)でSpringセキュリティを使用します。これらのフロントエンドhtmlコードを特にjspに入れるセキュリティ上の利点があるかどうかを判断しようとしていました私のバックエンドコードと同じサーバーにあるので、私は特定のjspタグの恩恵を受けることができます。または、私はそれを完全にajaxアプリケーションにして、別のサーバーのフロントエンドに提供できますか?まだ春のセキュリティを完全に使用していますか?jspを使用しないSpringセキュリティ

答えて

3

ここで私は想定しています

  • javascriptのフロントエンド
  • セキュリティの観点では、主にJSON

にサービスを提供するSpring MVCのレストアプリケーション、春のセキュリティは唯一のバックを保護することができます。フロントエンドのセキュリティ(ブラウザビューでのリンクやコマンドの非表示)は、ユーザーがAjaxのものであっても常にリクエストを偽造できるため、幻想に過ぎません。

ユーザーエクスペリエンスの観点からは、決してユーザーに可能性を示すべきではないことが明らかであり、使用するときには許可されていないことを伝えてください。したがって、フロントエンドはユーザーに与えられる特権を知る必要があります。 Springセキュリティには、JSPページで使用できるサーバー側のタグがいくつか付属していますが、Javascriptフロントエンドでは、現在のユーザー機能を返す特別なURLサーバー側を実装する必要がありますか?認証し、結果をクライアントセッションにキャッシュします(Windows.sessionStorage)。あなたのjavascriptコードは、特定のユーザに何を表示するべきかを知っています。

+0

現在のユーザーに利用可能なURLを取得する方法はありますか? – Sumit

3

あなたのコントローラでAJAX JSONコールレベルを提供するリクエストURLを保護するためにスプリングセキュリティを使用できます。これが私の提案です。

機能やデータなどをJSフロントエンドで表示/非表示にする方法に関係なく、機能やデータを提供するJSON呼び出しをセキュリティで保護することが重要です。このようにして、たとえエンド・ユーザーがフロントエンドをハックしようとしたとしても、それは簡単なので、アクセス不足のためにRESTコールの実行に失敗することがあります。

「あなたはこのタグを使ってこのセキュリティを確保できますか?」という疑問が少しありますか?絶対に - コールレベルでのセキュリティが上記のように正しく処理されていることを確認してください。任意のフロントエンドで使用できる別のアプリケーションのように、REST/JSONサービスを構築する必要があります。

2

あなたはSpring Securityを使用してサーバー側を保護することができます。つまり、「完全にajaxアプリケーションにすることはできますか?」はい。

Ajaxアプリケーションの場合は、サーバー側をRESTfulなAPIにすることをお勧めします。その場合を想定します。

「セキュリティ」には、認証と認可の2つの要素があります。

認証とは、クライアントが実際に自分が主張していると確信できるように(ユーザーID 12345など)、いくつかの認証情報(キー、OAuthトークン、ユーザーとパスワードの組み合わせなど)を提供することを意味します。この認証は、アプリケーションによってセッションの一部として保持されます。 Httpはステートレスなので、サーバへのその後のリクエストはすべて、そのセッションの識別情報を送信する必要があるため、サーバはそれを探すことができます。 Spring Securityでの認証について知る必要があるのは、hereです。ユーザーの認証方法を知らなくても、私はより具体的にすることはできません。

承認はより簡単です。ユーザーID 12345はすべてにアクセスできない場合があります。彼は例えば/widgets/gidgetsにアクセスすることができますが、/widgets/fidgetsにはアクセスできません。そのためには、最も簡単な方法は@PreAuthorizeアノテーションです。詳細についてはhereをご覧ください。例は次のようになります。これは舞台裏、ない

@RestController 
@RequestMapping("/widgets") 
public class WidgetController{ 
    @RequestMapping("/gidgets") 
    @PreAuthorize("hasRole('GIDGET_MANAGER')") 
    List<Gidget> getGidgets(){ 
     return gidgetService.getGidgets(); 
    } 

    @RequestMapping("/fidgets") 
    @PreAuthorize("hasRole('FIDGET_MANAGER')") 
    List<Fidget> getFidgets(){ 
     return fidgetService.getFidgets(); 
    } 
} 

何、それはパスに基づいて、要求をインターセプトしていることで、それが現在認証されたユーザが指定した名前を持つ役割を持っているかどうかを検証し、メソッドは肯定的な場合に実行することができます。それ以外の場合は、メソッドの実行を完全にスキップして、クライアントに401 UNAUTHORIZED応答を返します。

関連する問題