0

そのため、プロジェクトのレイアウト/構造について助けが必要です。私はウェブサイトを作成していますが、これまでのところ、LDAP サーバーに対して Apache Shiro でユーザーを認証し、ユーザーをスプラッシュ ページにリダイレクトするログイン ページが動作しています。ユーザーが持っている権限に応じて、スプラッシュ ページで特定のものを表示できる/できない場合があります。

私がやりたいことは、セッション情報 (つまり、ログインしたばかりのユーザー) から新しい ShiroUser を作成し、いくつかのロールを割り当てることです。たとえば、

def shiroUser = new ShiroUser()
shiroUser.username = session.username
shiroUser.addToRoles(ShiroRole.findByName('ROLE_USER'))
shiroUser.save()

によってROLE_USER定義されます。

def shiroRole = new ShiroRole()
shiroRole.name='ROLE_USER'
shiroRole.save()

今のところ、ハードコーディングして、後でテーブルを参照し、そのテーブルの値に基づいてロールを割り当てるように調整することに興味があります。

私が疑問に思っているのは

  • これはどこに置けばいいですか?
  • このために新しいコントローラーを作成しますか?
  • shiroRoles はどこで定義しますか?
  • これを行うのは賢明ですか?(誰かがログインするたびに新しい ShiroUser を作成する)

これまで Web サイトを作成したことがないため、コードをどのように構成するか、またはどこに配置するかがわかりません。(ちなみに、GGTS を使用しています。) 方向性やアドバイスをいただければ幸いです。私は Grails in Action、Making Java Groovy、The Definitive Guide to Grails 2 などの多くの本を参考にしていますが、それらの例のほとんどは私がやりたいことと一致しません。私が見つけていないチュートリアルがある場合は、それらを見てみたいと思います。(私はたくさん調べましたが、リストしたようなコードのスニペットしかありませんが、実際にどこに行くのかは指定していません!)

4

1 に答える 1

0

私は似たようなことをしました:

https://github.com/vahidhedayati/kchat/blob/master/grails-app/domain/kchat/UserDetails.groovy

しかし、私の場合、アプリでユーザーを作成し、さまざまな LDAP 情報を保存していました。後で securityFilters で独自のフィルタリング チェックを使用して、LDAP グループまたはユーザー ID が内部の合格/不合格ルールと一致し、securityFilters を介して true/false アクセスを許可したことを確認しました特定のアクション/コントローラー呼び出し。

また、このhttps://github.com/vahidhedayati/customshiroは、おそらく上記の実装のより良い説明です。

これらは、ニーズに合ったより良い設計を考え出すのに役立ちます。

私のプロジェクトで Grails の Shiro Security を実装する方法

Shiro プラグインを使用して、Grails アプリケーションのすべてではなく一部のページを保護する

http://coderberry.me/blog/2012/04/26/grails-authentication-with-shiro/ .

SecurityFilters を使用する必要があります (上記のリンクのいくつかに見られるように)。

browseStore(controller:"store", action:"(show|list)") {
before  = {
  // Ignore direct views (e.g. the default main index page).
                if (!controllerName) return true

                // Access control by convention. 
                accessControl() 
}
}

または、コントローラーでバックエンドの資格情報を一致させるためにもっと面倒です

SecurityUtils.subject.isPermitted("someController:someAction")
or
if (SecurityUtils.subject.isPermitted("printer:query:lp7200")) {
    // Return the current jobs on printer lp7200
}

gsp でさらにフロントエンドをチェックする場合: uri が shiro によって許可されているかどうかを検出する方法、または uri からコントローラー名を抽出する方法

<shiro:hasPermission permission="someController:someAction">
     <g:link...>
</shiro:hasPermission>
<shiro:lacksPermission permission="someController:someAction">
     No link
</shiro:lacksPermission> 

E2A 私の最初の方法では、特定のコントローラーアクション呼び出しに対するユーザー/ユーザー部門の制御 + このアプリ環境と appId (これは渡される内部値) の内部チェックはすべて動的であり、SecurityFilters が構成されていても実際の制御検証するDBエントリに依存するカスタマイズされたチェックに渡されます。これが DB であることは、バックエンドの Controller/SecurityFilters を更新する必要なく、特定のユーザー/部門のユーザー グループへのアクセス許可を更新または追加できることを意味します。私はこれを要点に入れなければなりませんでした。さもなければ、それに答える価値のある章になります

https://gist.github.com/vahidhedayati/71d92f8153ade5d732b3

役立つかもしれない他のもの: 逮捕されたプラグインを見てください。github.com/vahidhedayati/testingarrested のプラグインのコンパイル済み出力があるデモ サイトはこちら

于 2015-07-18T11:35:56.030 に答える