2010-09-24 100 views

回答

127

真正的區別在於@PreAuthorize可以與Spring Expression Language (SpEL)一起使用。您可以:

  • 訪問方法和屬性SecurityExpressionRoot
  • 訪問方法的參數(需要與調試信息或自定義ParameterNameDiscoverer編譯):

    @PreAuthorize("#contact.name == principal.name") 
    public void doSomething(Contact contact) 
    
  • (高級功能)加入自己的方法(覆蓋MethodSecurityExpressionHandler並將其設置爲<global-method-security><expression-handler ... /></...>)。
+1

OK,所以在我的示例中沒有區別,謝謝! – 2010-09-24 11:41:31

+0

不知道這個,但看起來很棒!:D – 2016-03-04 16:56:16

32

簡單地說, @PreAuthorize@Secured更新。

所以我說這是更好地使用@PreAuthorize,因爲它是「爲基礎的表達」,你可以使用這樣的表達式hasRole,hasAnyRole,permitAll等

要了解表情,看到這些example expressions

36

如果你想這樣做的訪問只有當用戶有基於role1和role2所的,你將不得不使用@PreAuthorize

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

使用

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

@PreAuthorize是不同的方法,它比@Secured更強大。

較舊的@Secured註釋不允許使用表達式。從Spring Security 3開始,更靈活的註釋@PreAuthorize和@PostAuthorize(以及@PreFilter和@PostFilter)是首選,因爲它們支持Spring表達式語言(SpEL)並提供基於表達式的訪問控制。

@Secured( 「ROLE_ADMIN」)註解相同@PreAuthorize( 「hasRole( 'ROLE_ADMIN')」)的@Secured({ 「ROLE_USER」, 「ROLE_ADMIN」)被認爲是作爲ROLE_USER或 ROLE_ADMIN。因此您無法使用 @Secured來表達AND條件。您可以使用@PreAuthorize(「hasRole('ADMIN或hasRole('USER')」)來定義相同的結果,這可以更容易地理解爲 .您可以同時表達AND,OR或NOT(!)

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

相關問題