2010-12-01 7 views
5

नियंत्रक को @With(Secure.class) जोड़ना सभी अनधिकृत एक्सेस ब्लॉक करता है। क्या इसे केवल कुछ क्रियाओं के लिए सक्षम करने के लिए, या नियंत्रक पर सक्षम होने के बाद कुछ क्रियाओं को छोड़ने का कोई तरीका है?प्ले फ्रेमवर्क: कुछ कार्रवाइयों के लिए लॉगिन की आवश्यकता कैसे है, लेकिन सभी

उत्तर

9

आप सुरक्षित मॉड्यूल के साथ ऐसा नहीं कर सकते हैं। जैसा कि नील्स ने कहा कि सुरक्षित मॉड्यूल एक समाधान से अधिक उदाहरण है। आप एनोटेशन से पहले @ अपनी सुरक्षा प्रणाली बना सकते हैं। यहां एक उदाहरण दिया गया है:

public class Admin extends Controller { 

@Before(unless={"login", "authenticate", "logout", "otherMethod"}) 
void checkAccess() { 
    // check the cookie 
} 

public void login() { 
    render(); 
} 

public void authenticate(String email, String password) { 
    // check the params and set a value in the cookie 
} 

public void logout() { 
    // delete cookie 
} 

मैं आपको सुरक्षित मॉड्यूल के स्रोत कोड को पढ़ने की सलाह देता हूं।

+0

आप इसे सुरक्षित मॉड्यूल के साथ भी कर सकते हैं। नीचे मेरा जवाब देखें। –

0

आप सुरक्षित नियंत्रक के @ पहले-टैग पर मूल्य या तब तक सेट कर सकते हैं। सिक्योर-मॉड्यूल एक समाधान से अधिक उदाहरण है।

+0

सुरक्षित मॉड्यूल जो कुछ भी मैं चाहता हूं उसे करने के लिए पर्याप्त एक्स्टेंसिबल प्रतीत होता है। क्या ऐसी अन्य कमियां हैं जिन्हें मैंने अभी तक नहीं खोजा है? –

1

जो मैं ढूंढ रहा था उसे प्राप्त करने के लिए, मैंने Check एनोटेशन की प्रतिलिपि बनाई और Public एनोटेशन बनाया। उन्हें एक @Public एनोटेशन जोड़कर प्रवेश किए बिना

if (getActionAnnotation(Public.class) != null) 
    return; 

अब With(Secure.class) का उपयोग कर नियंत्रकों में कार्रवाई सुलभ बनाया जा सकता है:

package controllers; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface Public { 

} 

तो मैं Secure.checkAccess की शुरुआत करने के लिए इन दो पंक्तियों को जोड़ा।

4

तब से मैंने अपने पहले @Public समाधान को कुछ हद तक सीमित पाया है क्योंकि यह विरासत में कार्यवाही को संबोधित नहीं कर सकता है। मैं बजाय एक वर्ग स्तर के एनोटेशन के लिए चले गए हैं:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface AllowGuest { 

    String[] value(); 
} 

और Secure.checkAccess() विधि की शुरुआत के लिए इस कोड कहा:

AllowGuest guest = getControllerInheritedAnnotation(AllowGuest.class); 
if (guest != null) { 
    for (String action : guest.value()) { 
     if (action.equals(request.actionMethod)) 
      return; 
    } 
} 

जो इस तरह इस्तेमाल किया जा सकता: @AllowGuest({"list","view"})

यह स्थानीय और विरासत कार्यों तक पहुंच की अनुमति देना आसान बनाता है, और यह देखने के लिए कि नियंत्रक में कौन सी कार्रवाइयां असुरक्षित हैं।

2

नियंत्रक को @With(Secure.class) एनोटेशन निकालें और नियंत्रक के अंदर कोड का यह टुकड़ा जोड़ें।

@Before(unless={"show"}) 
static void checkAccess() throws Throwable { 
    Secure.checkAccess(); 
} 

जहां show कार्रवाई आप सार्वजनिक रूप से उपलब्ध बनाने के लिए की जरूरत है।

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