Spring Security 3の@Securedと@PreAuthorizeの違いは何ですか?


147

春のセキュリティの違いは何ですか?

 @PreAuthorize("hasRole('ROLE_USER')")
 public void create(Contact contact)

そして

@Secured("ROLE_USER")
public void create(Contact contact)

PreAuthorizeがSpring Elで動作することを理解していますが、サンプルでは実際の違いはありますか?

回答:


169

本当の違いは、Spring Expression Language(SpEL)で@PreAuthorize動作できることです。あなたはできる:

  • のメソッドとプロパティにアクセスしますSecurityExpressionRoot
  • アクセスメソッドの引数(デバッグ情報またはカスタムでのコンパイルが必要ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (高度な機能)独自のメソッドを追加します(オーバーライドMethodSecurityExpressionHandlerしてとして設定<global-method-security><expression-handler ... /></...>)。

これについては知りませんでしたが、すごいようです!:D
アルフォンソニシカワ

52

ユーザーがRole1 Role2を持っている場合にのみメソッドにアクセスするようなことをしたい場合は @ PreAuthorizeを使用する必要があります。

@PreAuthorize("hasRole('ROLE_role1') and hasRole('ROLE_role2')")

使用する

@Secured({"role1", "role2"}) // is treated as an OR

40

単に、 @PreAuthorizeより新しいです@Secured

したがって、@PreAuthorize「式ベース」であり、hasRole、hasAnyRole、permitAllなどの式を使用できるため、使用する方が良いと私は言います。

式については、これらの式の例をご覧ください。


13

@PreAuthorizeは異なり、それよりも強力です@Secured

  • 古い@Securedアノテーションでは、式を使用できませんでした。

  • Spring Security 3以降では、Spring Expression Language(SpEL)をサポートし、式ベースのアクセス制御を提供するため、より柔軟なアノテーション @PreAuthorize@PostAuthorize(@PreFilterおよび@PostFilterと同様)が推奨されます。

  • @Secured("ROLE_ADMIN")アノテーションはと同じ@PreAuthorize ("hasRole('ROLE_ADMIN')")です。

  • これ@Secured({"ROLE_USER","ROLE_ADMIN")は、ROLE_USER OR ROLE_ADMIN と見なされます。

したがって、AND条件を使用して表現することはできません

@Secured。同じことをで定義できます@PreAuthorize("hasRole('ADMIN') OR hasRole('USER')")。これは理解しやすくなります。AND、OR、またはNOT(!)も表現できます。

@PreAuthorize( "!isAnonymous()AND hasRole( 'ADMIN')")


1
私の編集を元に戻したとき、これにエラーはないと言っています"hasRole('ADMIN OR hasRole('USER')"か?
リゴン

8
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
|                                               |                         @Secured                         |                         @PreAuthorize                           |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Spring EL expressions                         | Does'nt supports.                                        | Supports                                                        |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Multiple roles conjunctions with AND operator | Does'nt supports.(If there are multiple roles defined    | Supports                                                        |
|                                               |they will be automatically combined with OR operator)     |                                                                 |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| To enable annotation                          | Add following line to spring-security.xml                | Add following line to spring-security.xml                       |
|                                               | <global-method-security secured-annotations="enabled" /> | <global-method-security pre-post-annotations="enabled"/>        |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Example                                       | @Secured({ROLE_ADMIN , ROLE_USER})                       | @PreAuthorize("hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')") |
|                                               | public void addUser(UserInfo user){...}                  | public void addUser(UserInfo user){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.