1

私はレガシーgrailsアプリケーションに取り組んでいます。

このようなテーブルがいくつかあります

User ( id, name,enterprise_id)

Enterprise (id, name)

Asset (id,description, enterprise_id)

特定のユーザーがアセットにアクセスしたいときに、それが適切な enterprise_id を持っていること (つまり、ユーザーがアセットと同じエンタープライズに属していること) を検証したいと考えています。

たとえば、

Microsoft のユーザーである John と Charles (Oracle のユーザー) のうち、Charles のみが Java 仮想マシンにアクセスできる必要があります。

Enterprise
id,name
--------
1 Oracle
2 Microsoft

Asset
id,description,enterprise_id
----------------------------
1 Java VM     1
2 .NET        2

User
id name    enterprise_id
----------------------
1  John     2
2  Charles  1

春のセキュリティについて読んでいますが、役に立たないようです。ユーザー認証、パスワード、ロールなどしか表示されません (もちろん、間違っている可能性もあります)。これらはすでに保護されており、正常に機能しています。現時点では、フィルターを検討していますが、それらを機能させることができず、独自のセキュリティを展開することはできません (この質問を参照)。これは正しくないようです。

何かご意見は?Spring Security は進むべき道ですか? シロ?

前もって感謝します

4

3 に答える 3

3

これをspring-security-acl (spring-security-core に依存) で実装できます。

それ以外の場合は、一連のオブジェクト レベルの承認フィルターを使用して 2 フェーズのアプローチ (認証 + 承認) を実装できます。

于 2010-09-01T15:26:08.123 に答える
1

これにはHibernateFilterプラグインを使用しています。MultiTenantプラグインとそのコンパニオンであるFalconeプラグインもあります。

これらが行うことは、基本的にすべてのDBクエリに制約を追加して、あなたが目指していると思うことを実行することです。(Hibernate Filterを使用した)一般的な解決策は、これをAssetドメインに追加することです(新しいドメインごとにフィルター名を変更します)...

static hibernateFilters = {
  assetEnterpriseFilter(condition: ':enterpriseId=enterprise_id', types: 'integer', default: true)
}

...そしてプラグインからHibernateFilterFiltersを抽出して、このようにオーバーライドします(セッション変数をパラメーターとして設定します)...

class HibernateFilterFilters {

    def filters = {
        all(controller:'*', action:'*') {
            before = {
                    def hibernateSession = grailsApplication.mainContext.sessionFactory.currentSession
                    DefaultHibernateFiltersHolder.defaultFilters.each {name ->
                        hibernateSession.enableFilter(name).setParameter('enterpriseId', session?.enterpriseId ? session.enterpriseId.toInteger() : new Integer(0))
                    }
            }

            after = {

            }
            afterView = {

            }
        }
    }

}

...そして、DBでenterprise_id=0を使用しないようにしてください。

于 2010-09-02T08:51:00.643 に答える
0

Apache Shiro にはアクセス制御が組み込まれており、そのための grails プラグインもあります。

認証とは、アプリケーションへのログインなど、本人であることを証明する行為です。承認とは、特定のデータまたはアプリケーション機能へのアクセスを制御するプロセスです (「誰が」「何を」実行できるかを制御します)。

Shiro は、これらの概念の両方を API に組み込んでおり、非常にうまく機能します。個々のインスタンスへのアクセスを制御することもできます (たとえば、ID 12345 の「ユーザー」を「表示」するなど)。Shiro の Grails プラグインと Shiro のディストリビューションを確認することを強くお勧めします。これには、いくつかのサンプル Web アプリケーション (Spring の有無にかかわらず) が含まれており、そのアクセス制御の使用方法を確認できます (URL ベースのリソースのサーブレット フィルターを使用)。コントロールまたはアノテーションを介して個々のメソッドを保護します。

HTH、

于 2010-09-24T17:43:47.433 に答える