2017-10-10 18 views
3

私の春のブートアプリケーションで私は私の残りのAPIへのアクセスを管理するAuth0と働いています。
Auth0のscopeに加えて、各ユーザーにROLEを追加して、特権の低いユーザーが特定のAPIにアクセスできない追加のアクセス制御層を追加したいと考えています。春のセキュリティ/ Auth0の承認に 'ROLE'を追加

私はカスタムルールと認可の拡張については読んできましたが、私にとって正しい実装が何かを理解できませんでした。

は、ここに私のWebSecurityConfigurerAdapterコードスニペットです:
だから基本的に私は/test/**

@Override 
    protected void configure(HttpSecurity http) throws Exception { 
     JwtWebSecurityConfigurer 
       .forRS256(configBean.getAuth0ApiAudience(), configBean.getAuth0Issuer()) 
       .configure(http) 
       .authorizeRequests() 
       .antMatchers(HttpMethod.GET, "/test/**").hasAuthority("read:test") 
       .anyRequest().authenticated(); 
    } 

すべてのヘルプははるかに高く評価されるだろうにアクセスできるようにするには例えばのみ「ADMIN」をしたいです!

答えて

3

ここにはいくつかのオプションがあります(少なくとも..)。

1)。与えられたユーザーに "ROLES"が割り当てられている決定ロジックを処理するためのルールを使用することができます。これをscope(これも可能です)にタグ付けするのではなく、custom claimとしてそのアクセストークン。ルール本体には、

// lookup the permissions for given user somehow (secured webhook, static map etc) - here lets imagine we want ROLE_USER assigned 

context.accessToken.scope = "ROLE_USER" 
// or 
context.accessToken['https://mydomain/roles'] = "ROLE_USER" 

2)のようなものを含めることができます。 Auth0のJWTアクセストークンで利用可能なauth0ユーザIDをAPIに送信するだけで、Auth0の "out of band"を使用するための細かい粒度のパーミッションを調べることができます。 Auth0ユーザプロファイルにメタデータとしてタグを付けた場合など、auth0を使用することで、Auth0ユーザプロファイルの参照を行うことができます(管理API)をユーザIDで取得し、詳細を取得してください。このアプローチが好きな場合は、JWTアクセストークンからuserIdクレームを取得するJavaについての説明は、example hereを参照してください。

3)グループ、役割、および権限を介したユーザー認証のサポートを提供するAuth0 authorization extensionをご覧ください。ログインプロセス中に予想される動作を定義することができ、実行時に実行されるルールで設定がキャプチャされます。

ここでは、上記のメリットと、プロジェクトに必要なものがあります。上記のコードに従って既存の宣言的認可を実際に活用したい場合は、オプション1を使用し、scopeにROLES情報をペグするのが最も簡単な方法です。

しかし、実際にはオプション2)を推奨します。大部分の "実用的な"中小規模のベンチャーにとっては、ここでは、コントローラのエンドポイント内に小さなプログラムコードが必要になり、ROLESをルックアップしてそのような方法でセキュリティを決定します。また、コントローラコードに達する前に実行される一般的なカスタムフィルタにルックアップコードをプッシュすることもできます。これは、先進の開発者オプションのような、Spring Securityの操作を必要とします。アプローチは妥当なアプローチです。here for demonstrationを参照してください。ただし、ビジネスロジックを構築してライブラリーを構築することに乗り遅れないようにしてください。

オプション3)。深刻なエンタープライズアプリケーションを構築し、すべての統合が必要な場合、特にActive Directoryなどのエンタープライズ接続との統合が有効な場合は、ぜひ検討する価値があります。

あなたがまだ混乱している場合は、私にコメントを残してください。しかし、うまくいけば、上記を参考にしてさらに調査することができます。

クイックアップデートは、私たちの議論にさらに

、ここにあなたがについて尋ねたアイデア与え少しルールです:

function addRoleScopesToAccessToken(user, context, callback) { 
    console.log("add-role-scopes-to-access-token rule"); 
    user.app_metadata = user.app_metadata || {}; 
    var roles = user.app_metadata.roles; 
    if (roles && roles.length > 0) { 
    context.accessToken.scope = roles.join(' '); 
    } 
    callback(null, user, context); 
} 

をそして、これはあなたの「app_metadata」のように見えるかもしれない方法であります:

{ 
    "roles": [ 
    "role1", 
    "role2" 
    ] 
} 

あなたはscopeに追加の役割を持つJWTのアクセストークンで終わる必要があります。例えば。

enter image description here

+0

ありがとうございました。 私はすでにAuth0のカスタムメタデータに自分のROLEを書いているので、オプション#2に行くと言います - これに基づいてセキュリティはどのようにアクセスを拒否しますか? – Killyz

+0

こんにちは、私は上記の私の答えを更新 - オプション1とオプション2に関する私の点を参照してください。オプション1は、あなたの現在のコード/スプリングブートの設定を確認する宣言的な "スコープ"チェックボックスをサポートします。オプション2はより多くの作業を必要とします。カスタムフィルタとして行うことも、コントローラ自体の中で行うこともできます。 – arcseldon

+0

もう少しのコメントと、古いAuth0ライブラリへのリンクを追加しました。これは、v1に置き換えられて2016年に書いたものです。 – arcseldon

関連する問題