2011-11-08 14 views
4

私はss3で新しく、参照を読んでいます。また、私は春のセキュリティブックを読んでいます。春のセキュリティでの役割と許可3

しかし、ロールの権限については何も見つかりません。

たとえば、フォームベース認証の設定は次のとおりです。

私は、ユーザの操作(追加/削除)を制御したい
<http auto-config='true'> 
    <intercept-url pattern="/user/add/**" access="hasRole('USER_ADMIN')"/> 
    <intercept-url pattern="/user/delete/**" access="hasRole('USER_ADMIN')"/> 
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login login-page='/login.jsp'/> 
    </http> 

:私は誰をユーザーに異なるしたい以来、私は「USER_ADMIN」の役割を定義するが、これは十分ではありません

<intercept-url pattern="/user/add/**" access="hasRole('USER_ADMIN')"/> 
<intercept-url pattern="/user/delete/**" access="hasRole('USER_ADMIN')"/> 

を「削除」権限を持っているユーザーから「追加」権限を持っています。

「user_admin_add」や「user_admin_delete」のようなロールを追加することもできます。

しかし、「追加」または「削除」は権限ではなく役割であるため、これは良い考えではないと思います。

どのように作成するのですか?

また、すべての役割をxmlファイルに設定する必要があるようですが、新しい役割と権限を動的に追加することはできますか?

答えて

3

権限を特権とみなしてください。そして、あなたが必要なだけそれらを粒状化する。もう1つのことは、RESTFulの実装をさらにすべきであるということです。しかし、これは別のスレッドです。

たとえば、「削除」は「削除」HTTPメソッドです。その後、あなたは次のようになります。

<security:intercept-url pattern="https://stackoverflow.com/users/*" method="DELETE" access="ROLE_DELETE_USER" /> 

curl -X DELETE -u login:password 'http://example.com/users/1'

にid 1userを削除します。

RESTFulによって、urisは識別子またはアクションのいずれかであるため、追加ロール(特権)ではdinamically使用されません。これらの役割は、xmlファイルを含む新しいリソースに対して使用されるためです。

**ワイルドカードを使用しない限り、これを行うことはできません。私の意見では、慎重に使用しないとトラブルにつながる可能性があります。

+0

もっとRESTFul実装ですか?詳細を教えてください。私は興味があります。 :)ちょっと、動的にロールを追加するのはどうですか? – hguser

+0

dinamicallyロールを追加しますか?私は申し訳ありませんが理解できません。 – ssedano

+0

しかし、htmlページでは、http deleteメソッドを使うためのリンク '/ user/1'をどのように構築するのですか? – hguser

0

あなたは権限の行ではなく役割の行に沿って考えるべきです。ユーザーの追加と削除を区別したい場合は、ROLE_SALESとROLE_USER_ADMINというロールを定義することができます。セールススタッフは、新しいユーザーをシステムに追加できるようにする必要があります。

ロールの動的アプリケーションに関しては、Spring Securityのアーキテクチャを見てください。あなたはおそらく、適切なUserDetailsServiceを使用したり、実装したりしたいと思うでしょう。 UserDetailsService reference documentationを参照してください。

たとえば、JDBCデータベースにユーザー認可情報を格納する場合は、JdbcDaoImplを使用できます。

namespace introductionには異なる認証プロバイダを使用する例がいくつかあります。

2

私の個人的意見では、春のセキュリティには残念なことにいくつかの名前が付けられています。したがって、あなたが特権のためにそれを使用する場合、それは完全に動作する用語 "役割"にあまり注意を払わないでください。

私のアプリケーションでは、ロールと権限の間で選択するための命名規則を使用します。 (ロールは大文字、特権は小文字で表記します)。しかし、役割の投票者は「ROLE」で始まる文字列のみ注意を払うだろう注意を払う(デフォルトの設定は、変更することができます。)

も参照してくださいSpring security group based authorization

2

たぶん私はuser_admin_add」のような複数の役割を追加することができます'と' user_admin_delete 'です。

これは方法です。権限は役割であり、一般的に、それらの間の区別を不要と見なす人がいます。

私は役割ROLE_USER_ADDERまたは許可PERMISSION_ADD_USERSを持つ中くらいの差があるとは思いません。

しかし、必要に応じてロールを概念としてグループ化することができます。たとえば、ユーザーを追加したり削除したりできる役割adminを持つことができます。したがって、役割ROLE_ADMINは、PERMISSION_ADD_USERPERMISSION_REMOVE_USERとなります。まだ春は権限と権限の両方を単に権限として表示します。

動的ロールの追加では、たとえば、DBからの現在のユーザー権限を読み込むことで実行できます。春のセキュリティのUserDetailsServiceを見てください。それが返すUserDetailsオブジェクトにはgetAuthorities()メソッドがあり、これをDBから取り込むことができます。

/** 
* Returns the authorities granted to the user. Cannot return <code>null</code>. 
* 
* @return the authorities, sorted by natural key (never <code>null</code>) 
*/ 
Collection<GrantedAuthority> getAuthorities(); 

Here独自のUserDetailsServiceを実装するのは非常に良い例です。

関連する問題