2011-03-10 5 views
0

ユーザがuser:edit:1の権限を持っていて、注釈を使用している場合@RequiresPermissions("user:edit") shiroが例外をスローしているのはなぜですか?その許可は、彼らがuser:edit:1を持っているという事実によって示唆されるべきではありませんか?もし私が@RequriesPermissions("user:edit:1")を入れたらそれはうまくいきますが、操作の文脈の中で、私は何が1なのかまだ分かりませんので、後ほどメソッドでチェックされますが、メソッドに入るのを避けたいと思います。許可はuser:editです。Apache shiro暗黙のアクセス許可

答えて

1

"user:edit"は、"user:edit:1"を意味しますが、それ以外の方法ではありません。 @RequiresPermissions("user:edit")を引き続き使用し、"1"をあなたの方法でチェックすることができます。ワイルドカード@RequiresPermissions("user:edit:*")も使用できますが、これはまったく同じですが、わかりました。私は考えていない

3

は、ascandrolisの答えは史郎ドキュメントの状態から、正しいです:

しかしはるかに少ない理想的なランタイムチェックのため、次のとおりです。

if (SecurityUtils.getSubject().isPermitted("printer:print")) { //print the document }

なぜですか? 2番目の例では、「次のコードブロックを実行するには、どのプリンタにも印刷できなければなりません」と記載されているためです。しかし、 "printer:print"は "printer:print:*"と同等です!

Shiro Documentation

そこで@RequiresPermissions("user:edit:*")は、プリンシパルが、任意のユーザが編集できるようにする必要がある、すなわち@RequiresPermissions("user:edit")、同じことを意味します。

+0

質問、回答、およびドキュメントをもう一度読み、慎重に読んでください:ユーザーが「持っているもの」、「必要なもの」、および開発者が事前に知っている情報 – ascandroli

+1

申し訳ありませんが私の答えは、私はそれが意味するほど明確ではなかった場合。私が言いたいのは、2つのパーミッション「user:edit」と「user:edit:*」が100%同等であることです。したがって、後者を使用するという提案はセキュリティ上の例外を受け取るopの問題を解決しません。ちょうどあなた自身のためにそれを試してください(私がしたように)。 – martin

+0

代替案は[this](http://blog.42.nl/articles/spring-security-accessing-spring-beans-from-your-security-annotations)のようなものかもしれません:カスタムでのshiro-checkのやり方カスタムWebSecurityExpressionRoot(http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/)を使用して、注釈を使用して、 web/access/expression/WebSecurityExpressionRoot.html)を使用すると、http-requestにアクセスできるため、クライアントから提供されたIDにアクセスできます。 – martin

関連する問題