বসন্ত সুরক্ষা এক্সপ্রেশন ভাষা টীকাতে কীভাবে কাস্টম পদ্ধতি তৈরি করা যায়


92

আমি একটি শ্রেণি তৈরি করতে চাই যা টীকাগুলির মাধ্যমে পদ্ধতি ভিত্তিক অনুমোদনের জন্য বসন্ত সুরক্ষা অভিব্যক্তি ভাষার ব্যবহারের জন্য কাস্টম পদ্ধতি যুক্ত করে।

উদাহরণস্বরূপ, আমি 'কাস্টমমেথরোডারিংবুলিয়ান' এর মতো একটি কাস্টম পদ্ধতি তৈরি করতে চাই যাতে কোনওভাবে এটি ব্যবহার করা যায়:

  @PreAuthorize("customMethodReturningBoolean()")
  public void myMethodToSecure() { 
    // whatever
  }

আমার প্রশ্ন এই। যদি এটি সম্ভব হয় তবে আমার কাস্টম পদ্ধতিগুলি তৈরি করার জন্য আমার কোন শ্রেণীর সাবক্লাস করা উচিত, আমি কীভাবে বসন্তের এক্সএমএল কনফিগারেশন ফাইলগুলিতে এটি কনফিগার করতে যাব এবং কেউ আমাকে এইভাবে ব্যবহৃত একটি কাস্টম পদ্ধতির উদাহরণ দেবে?


4
আমার এখনই কোনও উত্তর টাইপ করার সময় নেই তবে আমি এই গাইডটি অনুসরণ করেছি এবং এটি দুর্দান্তভাবে কাজ করেছে: baeldung.com/… আমি স্প্রিং সিকিউরিটি 5.1.1 ব্যবহার করছি।
পল

উত্তর:


35

আপনার দুটি ক্লাসের সাবক্লাস করা দরকার।

প্রথমে একটি নতুন পদ্ধতি এক্সপ্রেশন হ্যান্ডলার সেট করুন

<global-method-security>
  <expression-handler ref="myMethodSecurityExpressionHandler"/>
</global-method-security>

myMethodSecurityExpressionHandlerউপরের একটি সাবক্লাস হবে DefaultMethodSecurityExpressionHandlerযা ওভাররাইড করে createEvaluationContext(), একটিতে একটি সাবক্লাস সেট MethodSecurityExpressionRootকরে MethodSecurityEvaluationContext

উদাহরণ স্বরূপ:

@Override
public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) {
    MethodSecurityEvaluationContext ctx = new MethodSecurityEvaluationContext(auth, mi, parameterNameDiscoverer);
    MethodSecurityExpressionRoot root = new MyMethodSecurityExpressionRoot(auth);
    root.setTrustResolver(trustResolver);
    root.setPermissionEvaluator(permissionEvaluator);
    root.setRoleHierarchy(roleHierarchy);
    ctx.setRootObject(root);

    return ctx;
}

হুম, একটি ভাল ধারণা বলে মনে হচ্ছে তবে ডিফল্টমেথডসিকিউরিটি এক্সপ্রেসন হ্যান্ডলারের সমস্ত সম্পত্তি অ্যাক্সেসর ছাড়াই ব্যক্তিগত so ধন্যবাদ
জোসেফ

4
আপনি বিশ্বাস রিসোলভার, ইত্যাদি? এই সকলের ডিফল্টমেথডসিকিউরিটি এক্সপ্রেসন হ্যান্ডলারের (কমপক্ষে স্প্রিং সিকিউরিটি 3.0.০ এ) সেটার রয়েছে
অর্গ

4
@ অ্যারিক্যাকম আপনি কীভাবে প্যাকেজ-ব্যক্তিগতMethodSecurityExpressionRoot হয়ে উঠবেন ?
সি রস

176

উল্লিখিত কোনও কৌশলই আর কাজ করবে না। দেখে মনে হচ্ছে যেন ব্যবহারকারীরা সিকিউরিটি এক্সপ্রেসন রুটকে ওভাররাইড করা থেকে রক্ষা করতে বসন্তটি অনেকদূর পেরিয়েছে।

সুরক্ষা টীকাগুলি ব্যবহার করতে 11/19/14 এডিট স্প্রিং সেট করুন:

<beans ... xmlns:sec="http://www.springframework.org/schema/security" ... >
...
<sec:global-method-security pre-post-annotations="enabled" />

এই জাতীয় শিম তৈরি করুন:

@Component("mySecurityService")
public class MySecurityService {
    public boolean hasPermission(String key) {
        return true;
    }
}

তারপরে আপনার জেএসপিতে এটির মতো কিছু করুন:

<sec:authorize access="@mySecurityService.hasPermission('special')">
    <input type="button" value="Special Button" />
</sec:authorize>

অথবা কোনও পদ্ধতির টীকায়িত করুন:

@PreAuthorize("@mySecurityService.hasPermission('special')")
public void doSpecialStuff() { ... }

অতিরিক্ত হিসাবে, আপনি বর্তমান প্রমাণীকরণের পাশাপাশি পদ্ধতির আর্গুমেন্টগুলি অ্যাক্সেস করতে আপনার টীকাগুলিতে স্প্রিং এক্সপ্রেশন ভাষা ব্যবহার করতে পারেন @PreAuthorize

উদাহরণ স্বরূপ:

@Component("mySecurityService")
public class MySecurityService {
    public boolean hasPermission(Authentication authentication, String foo) { ... }
}

তারপরে @PreAuthorizeনতুন পদ্ধতির স্বাক্ষরের সাথে মেলে আপনার আপডেট করুন :

@PreAuthorize("@mySecurityService.hasPermission(authentication, #foo)")
public void doSpecialStuff(String foo) { ... }

6
আপনার হ্যাশ পারমিশন পদ্ধতিতে বোশ, আপনি Authentication auth = SecurityContextHolder.getContext().getAuthentication();বর্তমান প্রমাণীকরণ টোকেন পেতে ব্যবহার করতে পারেন ।
জেমস ওয়াটকিন্স

4
জবাব ধন্যবাদ আপনার উত্তরের জন্য। বসন্ত কনফিগারেশন ফাইলে কি আমার সিকিউরিটি সার্ভিসেস সংজ্ঞায়িত করতে হবে?
ওয়াওউ

4
পরিষেবাটি যে প্যাকেজটিতে রয়েছে সেগুলির জন্য আপনার কোনও উপাদান-স্ক্যান সেটআপ থাকলে আপনার কোনও এক্সএমএল ফাইলে মাইসিকিউরিটি সার্ভিসটি সংজ্ঞায়িত করার দরকার নেই If যদি আপনার কোনও মিলের উপাদান নেই scan @ প্রিঅর্টিফাইজ org.springframework.sec সুরক্ষার থেকে আসে
জেমস ওয়াটকিন্স

4
আপনার এই জাতীয় টীকাতে শিমের নাম উল্লেখ করতে হবে: @ কম্পোনেন্ট ("মাইসিকিউরিটি সার্ভিস") বা @ নামযুক্ত টিকা ব্যবহার করুন।
জেমস ওয়াটকিন্স

4
@ ভিজেএস দয়া করে আমার সম্পাদনাটি দেখুন। এই টীকাগুলি ব্যবহার করতে আপনাকে বসন্তটি কনফিগার করতে হবে। আমি অবাক হয়েছি এই গুরুত্বপূর্ণ অনুপস্থিত বিশদ সম্পর্কে আর কেউ অভিযোগ
করেনি

14

ধন্যবাদ এরিক্যাকম , তবে এটি কয়েকটি কারণে কার্যকর হয় না:

  • ডিফল্টমেথডসিকিউরিটি এক্সপ্রেসন হ্যান্ডলারের বৈশিষ্ট্যগুলি ব্যক্তিগত (প্রতিচ্ছবি দৃশ্যমানতার কুলেজগুলি অনাকাঙ্ক্ষিত)
  • কমপক্ষে আমারগ্রহণে , আমি কোনও মেথসিকিউরিটিএলুয়েশন কনটেক্সট অবজেক্টকে সমাধান করতে পারি না

পার্থক্যগুলি হ'ল আমরা বিদ্যমান ক্রিয়েভ্যালুয়েশন কনটেক্সট পদ্ধতিটি কল করি এবং তারপরে আমাদের কাস্টম রুট অবজেক্টটি যুক্ত করি। অবশেষে আমি কেবলমাত্র একটি স্ট্যান্ডার্ডএলুয়েশন কনটেক্সট অবজেক্ট টাইপ ফিরিয়েছি যেহেতু মেথডসিকিউরিটি মূল্যায়নকন্টেক্সট সংকলকটিতে সমাধান হবে না (তারা উভয়ই একই ইন্টারফেস থেকে এসেছে)। এই কোডটি এখন আমার প্রযোজনায় রয়েছে।

বানান পদ্ধতিসিকিউরিটি এক্সপ্রেশনহ্যান্ডলারটি আমাদের কাস্টম রুটটি ব্যবহার:

public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler  {

    // parent constructor
    public CustomMethodSecurityExpressionHandler() {
        super();
    }

    /**
     * Custom override to use {@link CustomSecurityExpressionRoot}
     * 
     * Uses a {@link MethodSecurityEvaluationContext} as the <tt>EvaluationContext</tt> implementation and
     * configures it with a {@link MethodSecurityExpressionRoot} instance as the expression root object.
     */
    @Override
    public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) {
        // due to private methods, call original method, then override it's root with ours
        StandardEvaluationContext ctx = (StandardEvaluationContext) super.createEvaluationContext(auth, mi);
        ctx.setRootObject( new CustomSecurityExpressionRoot(auth) );
        return ctx;
    }
}

এটি সিকিউরিটি এক্সপ্রেসন রুট বাড়িয়ে ডিফল্ট রুটকে প্রতিস্থাপন করে । এখানে আমি হ্যাশটলটির নামকরণ করেছি হ্যান্টিটেলমেন্টে:

public class CustomSecurityExpressionRoot extends SecurityExpressionRoot  {

    // parent constructor
    public CustomSecurityExpressionRoot(Authentication a) {
        super(a);
    }

    /**
     * Pass through to hasRole preserving Entitlement method naming convention
     * @param expression
     * @return boolean
     */
    public boolean hasEntitlement(String expression) {
        return hasRole(expression);
    }

}

পরিশেষে সুরক্ষাকন্টেক্সটেক্স.এমএমএল আপডেট করুন (এবং এটি আপনার অ্যাপ্লিকেশনকন্টেক্সটেক্স.এমএমএল থেকে উল্লেখ করা হয়েছে তা নিশ্চিত করুন):

<!-- setup method level security using annotations -->
<security:global-method-security
        jsr250-annotations="disabled"
        secured-annotations="disabled"
        pre-post-annotations="enabled">
    <security:expression-handler ref="expressionHandler"/>
</security:global-method-security>

<!--<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">-->
<bean id="expressionHandler" class="com.yourSite.security.CustomMethodSecurityExpressionHandler" />

দ্রষ্টব্য: @ নিরাপদ টীকাগুলি এই ওভাররাইডটিকে গ্রহণ করবে না কারণ এটি ভিন্ন বৈধকরণ হ্যান্ডলারের মাধ্যমে চলে runs সুতরাং, উপরের এক্সএমএল-এ আমি পরে বিভ্রান্তি রোধ করতে তাদের অক্ষম করেছিলাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.