web-dev-qa-db-ja.com

役割ベースのWebアプリケーションを作成するための最良のアプローチは何ですか?

学校用のWebアプリケーションを作成する必要があり、次のような異なる役割が必要です。

  • 学生
  • 教授
  • 管理者

最初にログインし、資格情報を入力した後、アプリケーションがホームページにリダイレクトする必要があります。

ここでの質問は、ロールをどのように処理すればよいですか?各ロールに名前空間が必要ですか?つまり、students/index.jsp、professors/index.jsp、admin/index.jsp、またはすべてのロールに共通の名前空間がありますか? home/index.jspのようなものですか?次に、decorator/compositeパターンを使用して、ロールに基づいてメニューに異なるオプションを持たせます

この質問については、ユーザーとロールをそれぞれ独自のテーブルに保存する必要があることを知っています。この質問は、プレゼンテーション/ナビゲーション/許可ロールの処理とwebapp構造の作成方法に関連するものです。学生、別のフォルダ管理者、別の学生と呼ばれ、上記の点について(装飾パターンまたは複合パターン)

もちろん、私はこれほど小さなアプリを作成しているわけではありませんが、大きな役割のWebベースのアプリケーションを作成するために直面​​している問題を単純化したかったのです。

お時間をいただきありがとうございます。

14
Diego Ramos

間違いなくコードの重複につながるので、異なるロールに個別のページ(「名前空間」)を持たないことは間違いありません。

各機能のページを用意し、ユーザーの役割に基づいてアクセスを制限する必要があります。 (たとえば、一部のメニュー項目は学生には表示されませんが、教授と管理者には表示されます。)

役割ベースの権限を管理するための車輪を再発明することは絶対にしないでください。その目的のための戦闘実証済みのフレームワークがあります。他の人がすでに指摘したように、Java world、Spring、 Springセキュリティ が道です。

テクノロジーとしてのJSPは古くなっていると思うので、代わりに Angular を学習する必要があります。

動作するSpring/Angularプロジェクトの設定を取得するのは簡単ではないため、ウィザードを使用してプロセス全体をガイドする JHipsterアプリケーションジェネレーター を使用することをお勧めします。いくつかの質問に答える必要があります-タイプについて尋ねられたらmonolithic web application):次に、最新の推奨事項に従って、役割ベースのセキュリティを備えた作業プロジェクト構成を作成します。

最新のWebアプリケーションでの適切なロールベースのアクセス制御について学びたい場合、JHipsterで生成されたアプリケーションで使用されているソリューションを見るのが最善かつ最速のソリューションだと思います。

  • spring Security機能を使用してJavaバックエンドの呼び出しを制限します。生成されたプロジェクトでorg.springframework.security.access.annotation.Securedアノテーションの使用を探します
  • <h1 *jhiHasAnyAuthority="'ROLE_ADMIN'">Hello, admin user</h1>のように、ロールに基づいて特定のUIパーツを表示/非表示にするカスタムフロントエンドトリックを示します。これは、独自のユースケースに簡単に採用できます。
  • 2分程度で作業プロジェクトを作成できます。学習に最適です(最もシンプルなmonolithic web application
10

私のソリューションがあなたの問題に対して機能するかどうかはわかりません。しかし、私の場合は、次のようにします。

ユーザー0..n --- 0..mロール

ロール0..n --- 0..m特権

製品コード

あなたの場合、あなたが望むかもしれません:

  • Adminは、生徒のスコアを表示、編集できません。
  • Studentはスコアを表示できますが、編集できません。
  • Professorは、スコアの表示、編集、追加ができます。

以下のようにできます:

役割

  • ROLE_SCORE_EDITOR
  • ROLE_SCORE_VIEWER

特権

  • OP_READ_SCORE
  • OP_CREATE_SCORE
  • OP_UPDATE_SCORE
  • OP_DELETE_SCORE --->おそらくこれは必要ありませんが、例としては十分です。

ロール-特権

ROLE_SCORE_EDITOR

  • OP_READ_SCORE
  • OP_CREATE_SCORE
  • OP_UPDATE_SCORE

ROLE_SCORE_VIEWER

  • OP_READ_SCORE

ユーザー-役割

管理者(それは本当にあなた次第です、私の場合は空のままにしておくべきです)

教授

  • ROLE_SCORE_EDITOR

スチューデン

  • ROLE_SCORE_VIEWER

次に、テンプレートで_user.hasPrivilegeまたはuser.hasRole。それはうまくいくでしょう。

P/s:悪い英語でごめんなさい。何かが必要な場合は、以下にコメントするか、私の Gist にコメントしてください

2
Liem Le

あなたの質問に対する単一の答えはありません。すべてはプロジェクトの構造に依存します。言及したロールに多くの共通点がある場合は、すべてのロールに単一のindex.jspを使用することをお勧めします。そうすれば、共通ロジック(jsおよびcssライブラリー、カスタム共通スクリプト、ビュー、およびスタイルの組み込み)を複製する必要はありません。ロール間に共​​通点がほとんどない場合、選択したロールに応じてプログラムの実行中に単一のindex.jspファイルが動的に作成されるため、ロールごとに個別のindex.jspファイルを用意することをお勧めします(まだ可能だと思います)キャッシングによって修正します)。

プロジェクトでは、単一のindex.jspファイルを使用するアプローチを使用します。これは、そもそも多くの共通ロジックを持っているという事実によるものです。しかし、いずれにせよ、決定はあなたによって行われます。

さらに、Spring Securityを使用していて、プロジェクトの開発プロセス中に新しいロールを追加できる場合、@PreAuthorize ("hasRole ('ROLE_USER')")アプローチは適切ではありません。データベースに新しいロールを追加する場合、プロジェクトに多くのコードを追加して、この新しいロールにアクセスを許可する必要があるためです。したがって、この場合は、アクセス許可を介してアクセスを許可する方が適切です。関係を作成するmany to many between roles <-> permissions

1
Bohdan Petrenko

さまざまなロールを作成して、さまざまな制限区域へのアクセスを許可できます。たとえば、学生、教授、および管理者の役割を持つことができます。後で、役割に基づいてコンテンツへのアクセスを許可または禁止できます。 春のセキュリティ はあなたに良いかもしれません。

1
amanzoor

最善のアプローチは次のとおりです。 Spring Security

しかし、それを正しく行うには時間と勉強が必要なので、それまでは次のようなことをします。

  1. データベースにテーブルuserがあるとします。列名を追加しますuser_rights
  2. アプリケーションのこの列は、Userモデルクラスのフィールドです
  3. このフィールドをチェックし、必要に応じてロールを処理するメソッドを作成します

たとえば、ユーザーのロールがアクセスするページを決定する場合、これは簡単なコード例です。

Webページの開始時:

<h:body>

<f:metadata>
    <f:viewAction action="#{userService.checkIfLogged()}" />
    <f:viewAction action="#{userService.accessCheck('page 2')}" />
</f:metadata>

そしてあなたのBeanメソッドで:

@Override
@Transactional
public String accessCheck(String page) {
    try {
       HttpSession sess = Util.getSession();
       String user = sess.getAttribute("username").toString();
       Session session = this.sessionFactory.getCurrentSession();
       User logged = (User) session.createQuery("select u from User u where 
                     u.username = :logged").setParameter("logged", 
                                            user).uniqueResult();
       if (page.equals("page 1")) {
        if (logged.getRights().equals("simple")) {
            return "profile?faces-redirect=true";
        } 
        else {
            return "#";
        }
    }   ... etc.

これがお役に立てば幸いです。Springフレームワークの機能を引き続きお勧めしますが、それまでは小さなWebアプリに最適です。

0
Maral Kay

春のフレームワークと春のセキュリティを使用してWebアプリを開発してみてください以下の例を参照してください http://websystique.com/spring-security/spring-security-4-role-based-login-example/

0
Sumesh TG

この問題には複数のアプローチがあります。たとえば、フィルターを使用して、さまざまなユーザー/ロールに対するリソースのアクセスを認証および承認できます。これ以外に、Spring Securityは、Webリソースへの承認されたアクセスを保証する組み込みメカニズムを提供します。これ以外に、アプリケーションに管理パネルを作成し、さまざまなページをさまざまなロールに割り当てることができます(ただし、このアプローチではより多くのプログラミング作業が必要です)。また、web.xmlでセキュリティ制約を作成し、web-resource-collectionsをさまざまなロールに関連付けることもできます。

Spring Security。すぐに使用できる多くの機能を提供し、アプリケーションの構成と保守が非常に簡単になります。また、ライブラリが認証と承認(単純な言葉での役割)を処理する間、アプリケーションのロジックの構築にもっと集中できるようになります。さらに、多くのコミュニティサポートがあります。

開始する例を次に示します。 Spring security-hello world

上記の例から、私の主張にもっと重みを与えるためにコードのスニペットを示しましょう:

@Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
        .and().formLogin();

    }

したがって、上記の構成は、/adminページまたは管理ページのURL。例: /admin/profile/admin/homeなど、あなたは自分自身を認証するよう求められます(あなたの場合はユーザー名とパスワードで)。春のセキュリティは、ユーザー名とパスワードが正しいかどうかを確認します。これに加えて、指定されたユーザー名にロールadminがあるかどうかも確認します。 (パスワードとロール)の両方のチェックが成功した場合、あなただけがそのページにアクセスできます。

したがって、わずか数行のコードで、アプリケーションのロール管理でセキュリティ全体を制御できます。

サンプルの投稿では、ハードコードされたユーザー名が使用されていますが、データベースのプラグインも非常に簡単です。しかし、この例は、開始して、ユースケースに適合するかどうかを確認するのに適した方法です。

0
tryingToLearn

あなたが分離できることに基づいてrole_userのような名前のテーブルベースを作成することができます

異なる役割

0
rohit raj

異なるページを使用すると、DRY(繰り返さないでください)の原則に違反します。シンプルなソリューションが必要な場合は、Webアプリにフィルターを追加し、そこで承認を行います(サードパーティアプリに委任します)。毎回変更する必要がないように、グループレベルでjspページに条件を追加する必要があります。

Springセキュリティとjdbc認証も使用できます。

0
DevEmani

私は今、同様の状況にあります。私のプロジェクトには認証とロールベースの承認が必要です。 Javaアプリケーション。多くのユーザー管理を処理できる追加のアプリである Keycloak を使用することにしました。ただし、アプリのスコープによっては、やり過ぎかもしれません。

私が見るように、あなたはまだ認証を実装していません。私の場合、その部分は終了しており、ほとんどはKeycloak + Webサーバーでの構成によって行われました。

一般に、ほとんどの最新のWebサーバーでは、承認にJava EEセキュリティを使用できます。これにより、@ RolesAllowedなどの注釈を使用してアクセスを許可または拒否でき、Keycloakに関係なく機能します。 。この方法により、すべての異なるロールに対して統一された構造を維持し、実行される直前にリクエストの正当性のみを決定できます。

0
P Laack