2

私の現在の設定では、スタンドアロンのSpring oAuth2サーバー、スタンドアロンのリソースサーバー、およびリバースプロキシを備えたangularJsアプリがあります。

認証サーバー側では、2 つのクライアント (サービス通信用の Web アプリと内部クライアント) を登録しました。クライアント スコープとユーザー ロールを正しく受け取ります。

質問 1 クライアント (Web アプリ、モバイルなど) ではなく、ユーザーごとに異なる権限 (スコープなど) が必要です

各ユーザーの ClientDetails を作成する独自の ClientsDetailService を提供しようとしましたが、受け取るのはクライアント ID (「web-app」) だけで、どのユーザーがログインしているかを知る方法がありません。

ユーザーコンテキストを挿入する方法はありますか?

関連するスタックの質問

質問 2利用可能なすべてのアクセス許可を JWT に配置し、リソース サーバーで "hasPermission(...)" ロジックを実行すると、この問題を回避できます。基本的に、クライアント アプリは N スコープで動作し、Users ロールに基づいてサーバーがアクセス許可のリストを構築し、JWT を作成します。しかし...

  • ユーザーのアクセス許可を削除するとどうなりますか? JWT は無効化されていますか?
  • このシナリオの oAuth ワークフローは何ですか? (refresh_token は更新されたアクセス許可を取得しますか、それともユーザーは資格情報を再度入力する必要がありますか?)
  • これは悪い習慣のように思えるので、より良い解決策はありますか?

質問 3 spring oauth2 でより詳細な許可ロジックを実装する標準的な方法はありますか? (メソッド レベルのセキュリティで 100 以上の異なるアクセス許可があると考えてください)

4

1 に答える 1

2

Ok, I finally managed to map custom scopes per user using TokenEnhancer as follows:

public class AuthorityTokenEnhancer implements TokenEnhancer {

@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
    User user = (User) authentication.getPrincipal();

    final ImmutableMap<String, Object> additionalInfo = ImmutableMap.<String, Object>builder()
            .put("authorities", user.getAuthorities())
            .build();

    ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
    ((DefaultOAuth2AccessToken) accessToken).setScope(user.getPermissions());

    return accessToken;
}}

With this approach I can get currently logged in user and update scopes based on user permissions.

But still I don't know whether this is good practice or not.

于 2016-06-13T07:24:40.490 に答える