2016-12-29 13 views
0

RESTful Webサービスとバックエンドデータモデルのマルチテナントパーミッションモデルの例を探しています。私はSpringを使ってJavaでOAUTH ASとRESTful Webサービスを構築しました。バックエンドのほとんどが完了しましたが、今はセキュリティを構築しています。私が必要とするのは、ユーザーが異なるオブジェクトに対して異なる権限を持つことができることです。議論のために、アカウントを含む企業があるとします。 - すべてへのフル権 Spring(Java)を使用したデータモデルとRESTコントローラのマルチテナントパーミッションモデル

  • 会社の管理者権限 - 一つ以上の会社とその会社内のアカウントのさまざまなプロパティへの権利

    • スーパーユーザー:認証されたユーザーは、これらの権限のいずれかを有することができます。
    • アカウント権 - 会社内の1つ以上のアカウントに対する権利。

    たとえば、アリスはスーパー管理者になることができます。 BobはACME-USER1にアカウント権を持つことができますが、INITECHとその会社のすべてのアカウントに対して会社管理者権限を持ちます。 Billは、INITECH-USER2を超えるユーザー権限を持つエンドユーザーです。

    この概念は、最初はRESTコントローラに適用されます。 - >会社を作成 - >スーパーユーザー

  • GET /会社/ {ID} - >会社を取得する - その会社のために>スーパーユーザーと企業の管理者

    • POST /会社:私のWebサービスは、次のようになります
    • 会社のアカウントを作成する - >会社のスーパーユーザーと会社の管理者
    • GET/company/{id}/account/{acctid} - >アカウントを取得する - >スーパーユーザー、会社管理者、そのユーザー

    このコンセプトw ouldもデータモデルに拡張されています。同社は、次のプロパティがあり、各プロパティを変更するには、次の権限が必要になると言う:

    • 名 - >スーパー管理
    • CONTACT_NAME - >会社の管理者
    • CONTACT_EMAIL - >会社の管理者
    • max_accounts - ユーザモデルは次のようになり、スーパー管理者

    • 名 - >ユーザー
    • メール - >ユーザー
    • 有効 - >会社の管理者
    • クォータ - >スーパー管理

    私は当局のようなASの私のOAuthによって付与された作成しました:

    • ROLE_SUPERADMIN
    • ROLE_COMPANYADMIN-ACME
    • ROLE_COMPANYADMIN-INITECH
    • ROLE_USERADMIN-ACME-USER1
    • ROLE_USERADMIN-ACME-USER2

    役割は静的ではありませんので、私はJavaのように注釈を使用することができるよとは思いませんよ@Securedまたは@PreAuthorize。プリンシパル、会社、ユーザーを引数として取り上げ、必要な役割を生成し、ユーザーがそれを持っているかどうかを確認する方法を書いています。私はこれがベストプラクティスか、それを行うための "Spring-y"の方法があるかどうかはわかりません。前述のように、私はこれを自分のデータモデルにも適用したいと考えています。エンティティを複数のデータ転送オブジェクトに分割する必要はなく、アクセス権が評価される独自のRESTコントローラを使用します。

    また、特権を含む役割を持つhttp://www.baeldung.com/role-and-privilege-for-spring-security-registrationも読んでいます。私はCREATE_COMPANYやEDIT_QUOTAのような詳細な権限を作成するので、このモデルが好きです。これらは特定のオブジェクトに適用する必要があります。

    ベストプラクティスに関するこのようなや一般的な考え方を実装しているプロジェクトの例はわかります。

  • 答えて

    3

    Spring SpELでは、コンテキストSpring Expression Language (SpEL). Bean references.でBeanの参照を受け取ることができます。

    この場合、@PreAuthorizeアノテーションを使用できます。例:

    @Component("accessChecker") 
    public class AccessChecker { 
        public boolean hasAccessToCompany(Long companyId) { 
        return checkAccessRightsHere(SecurityContextHolder.getContext().getAuthentication(), companyId); 
        } 
    } 
    
    @Controller 
    public class CompanyController { 
        @RequestMapping("/company/{companyId}") 
        @PreAuthorize("@accessChecker.hasAccessToCompany(#companyId)") 
        public CompanyDto getCompany(@PathVariable("comapanyId") Long companyId) { 
    
        } 
    } 
    
    +0

    これはコントローラにとって間違いなく助けになりましたが、モデル/ DTOのプロパティ/フィールドレベルのセキュリティには役立ちません。 – aaronanderson

    +0

    @aaronandersonは、プレ/ポストフィルタを見る価値があります。彼らはまたSpELをサポートします。私はあなたがいくつかのコード例を提供すればもっと助けてくれるでしょう。 –

    +0

    私のプロジェクトはhttps://github.com/cypherkey/multi-tenant-rest-apiから入手できます。 READMEには私が達成しようとしていることが書かれています。コントローラのエンドポイントへのアクセスを管理するためにPreAuthorizeを使用しています。私は独自のModelMapper注釈をDTOで作成しています(https://github.com/cypherkey/multi- tant-rest-api/blob/master/src/を参照)。 main/java/com/redman/client/data/dto/UserDTO.java)。 – aaronanderson

    関連する問題