वसंत सुरक्षा 3 में @Secured और @PreAuthorize के बीच क्या अंतर है?


147

मेरे लिए यह स्पष्ट नहीं है कि वसंत सुरक्षा में क्या अंतर है:

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

तथा

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

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

जवाबों:


169

वास्तविक अंतर यह है कि स्प्रिंग एक्सप्रेशन लैंग्वेज (स्पेल) के@PreAuthorize साथ काम कर सकते हैं । आप ऐसा कर सकते हैं:

  • के तरीके और गुण SecurityExpressionRoot
  • प्रवेश विधि तर्क (डीबग जानकारी या कस्टम के साथ संकलन की आवश्यकता है ParameterNameDiscoverer):

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

इस बारे में पता नहीं था, लेकिन बहुत बढ़िया लगता है! : डी
अल्फोंसो निशिकावा

52

अगर आप कुछ ऐसा करना चाहते हैं जैसे कि विधि का उपयोग केवल तभी किया जाता है जब उपयोगकर्ता के पास भूमिका 1 और भूमिका 2 है तो आपको @Prethututize का उपयोग करना होगा

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

का उपयोग करते हुए

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

40

बस, @PreAuthorizeसे नया है @Secured

इसलिए मैं कहता हूं कि इसका उपयोग करना बेहतर है @PreAuthorizeक्योंकि यह "अभिव्यक्ति-आधारित" है और आप हैरो, हैसऑनरोल, पर्मअल आदि जैसे भावों का उपयोग कर सकते हैं।

भावों के बारे में जानने के लिए, इन उदाहरणों के भाव देखें ।


13

@PreAuthorizeअलग है, यह से अधिक शक्तिशाली है @Secured

  • पुराने @Securedएनोटेशन ने अभिव्यक्तियों का उपयोग करने की अनुमति नहीं दी।

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

  • @Secured("ROLE_ADMIN")एनोटेशन के रूप में ही है @PreAuthorize ("hasRole('ROLE_ADMIN')")

  • @Secured({"ROLE_USER","ROLE_ADMIN")ROLE_USER के रूप में माना जाता है या ROLE_ADMIN।

इसलिए आप AND स्थिति का उपयोग नहीं कर सकते

@ ठीक किया गया । आप उसी के साथ परिभाषित कर सकते हैं @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')"), जिसे समझना आसान है। आप व्यक्त कर सकते हैं और, या, या (!) भी नहीं।

@PreAuthorize ("! IsAnonymous () और 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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.