2010-09-24 6 views
110

यह के बीच वसंत सुरक्षा में अंतर क्या है मेरे लिए स्पष्ट नहीं है:वसंत सुरक्षा 3 में @ सुरक्षित और @PreAuthorize के बीच क्या अंतर है?

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

और

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

मैं समझता हूँ PreAuthorize वसंत एल के साथ लेकिन मेरे नमूने में काम कर सकते हैं, वहाँ एक वास्तविक अंतर है?

उत्तर

127

वास्तविक अंतर यह है कि @PreAuthorizeSpring Expression Language (SpEL) के साथ काम कर सकता है। आप कर सकते हैं:

  • SecurityExpressionRoot के एक्सेस विधियों और गुणों का उपयोग करें।

    @PreAuthorize("#contact.name == principal.name") 
    public void doSomething(Contact contact) 
    
  • (उन्नत सुविधा) अपने स्वयं के तरीकों (MethodSecurityExpressionHandler ओवरराइड और <global-method-security><expression-handler ... /></...> के रूप में सेट) जोड़ें:
  • पहुँच विधि तर्क (डिबग जानकारी या कस्टम ParameterNameDiscoverer साथ संकलन की आवश्यकता है)।

+1

ठीक है, तो मेरे नमूना कोई अंतर नहीं है, धन्यवाद –

+0

इस बारे में पता नहीं किया, लेकिन भयानक लगता है: डी –

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 अलग है होता पहुँच की तरह कुछ करना चाहता था, तो यह @ सुरक्षित से अधिक शक्तिशाली है।

पुराने @ सुरक्षित एनोटेशन ने अभिव्यक्तियों का उपयोग करने की अनुमति नहीं दी। स्प्रिंग सिक्योरिटी 3 से शुरू होने पर, अधिक लचीली एनोटेशन @ प्राइअधिकृत करें और @ पोस्टअधिकृत करें (साथ ही @PreFilter और @PostFilter) को प्राथमिकता दी जाती है, क्योंकि वे स्प्रिंग एक्सप्रेशन भाषा (एसपीईएल) का समर्थन करते हैं और अभिव्यक्ति-आधारित पहुंच नियंत्रण प्रदान करते हैं।

@Secured ("ROLE_ADMIN") एनोटेशन @PreAuthorize रूप में ही है ("hasRole ('ROLE_ADMIN')") @Secured ({ "ROLE_USER", "ROLE_ADMIN") माना जाता है ROLE_USER या ROLE_ADMIN के रूप में। इसलिए आप @ सुरक्षित का उपयोग करके और स्थिति को व्यक्त नहीं कर सकते हैं। आप @PreAuthorize ("hasRole ('व्यवस्थापक या hasRole (' उपयोगकर्ता ')") है, जो है के लिए आसान समझते हैं। आप व्यक्त कर सकते हैं और, OR, या नहीं (!) के साथ-साथ के साथ एक ही परिभाषित कर सकते हैं।

@PreAuthorize ("!! IsAnonymous() और hasRole ('व्यवस्थापक') ")

संबंधित मुद्दे