স্প্রিং এমভিসির ডেলিগেটিং ফিল্টারপ্রক্সির মূল বক্তব্য কী?


120

আমি আমার স্প্রিং এমভিসি অ্যাপ্লিকেশনটিতে এটি দেখতে পাচ্ছি web.xml:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

আমি কেন এটি সেখানে এবং এটি আসলে প্রয়োজন কিনা তা জানার চেষ্টা করছি।

আমি স্প্রিং ডক্সে এই ব্যাখ্যাটি পেয়েছি তবে এটি আমাকে তা বোঝাতে সহায়তা করে না:

দেখে মনে হচ্ছে যে এই উপাদানটি web.xmlবসন্তে সংজ্ঞায়িত সার্ভারলেট এবং উপাদানগুলির মধ্যে "আঠালো" applicationContext.xml

7.1 ডেলিগেটিং ফিল্টারপ্রক্সি

সার্লেলেট ফিল্টারগুলি ব্যবহার করার সময়, আপনাকে অবশ্যই এগুলি আপনার মধ্যে ঘোষণা web.xmlকরতে হবে, না তারা সার্লেট পাত্রে উপেক্ষা করা হবে। স্প্রিং সিকিউরিটিতে, ফিল্টার ক্লাসগুলি স্প্রিং মটরশুটিও অ্যাপ্লিকেশন প্রসঙ্গে সংজ্ঞায়িত হয় এবং এইভাবে স্প্রিংয়ের সমৃদ্ধ নির্ভরতা-ইনজেকশন সুবিধা এবং লাইফাইকেল ইন্টারফেসের সুবিধা নিতে সক্ষম হয়। স্প্রিংস এবং অ্যাপ্লিকেশন প্রসঙ্গে DelegatingFilterProxyমধ্যবর্তী লিঙ্ক সরবরাহ web.xmlকরে।

DelegatingFilterProxy ব্যবহার করার সময়, আপনি web.xmlফাইলে এমন কিছু দেখতে পাবেন :

<filter>
   <filter-name>myFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
   <filter-name>myFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

লক্ষ্য করুন যে ফিল্টারটি আসলে একটি DelegatingFilterProxyএবং ক্লাসটি আসলে ফিল্টারটির যুক্তি বাস্তবায়ন করবে না implement DelegatingFilterProxyফিল্টারের পদ্ধতিগুলি একটি শিমের মাধ্যমে কী সরবরাহ করা হয় যা বসন্তের অ্যাপ্লিকেশন প্রসঙ্গে পাওয়া যায়। এটি শিমটি স্প্রিং ওয়েব অ্যাপ্লিকেশন প্রসঙ্গে লাইফসাইকেল সমর্থন এবং কনফিগারেশনের নমনীয়তা থেকে উপকৃত করতে সক্ষম করে। শিমটি অবশ্যই প্রয়োগ javax.servlet.Filterকরতে হবে এবং ফিল্টার-নাম উপাদান হিসাবে এর একই নাম থাকতে হবে। আরও তথ্যের জন্য ডেলিগেটিং ফিল্টারপ্রক্সির জাভাডোক পড়ুন

সুতরাং, আমি যদি এটিকে আমার বাইরে নিয়ে যাই তবে web.xmlকী হবে? আমার সার্লেটগুলি স্প্রিং পাত্রে যোগাযোগ করতে সক্ষম হবে না? **

উত্তর:


127

এখানে এক ধরণের যাদু রয়েছে তবে শেষ পর্যন্ত সবকিছুই একটি নির্বিচার কর্মসূচি।

DelegatingFilterProxy একটি ফিল্টার যেমন উপরে ব্যাখ্যা করা হয়েছে, যার লক্ষ্য "হয় একটি বসন্ত-পরিচালিত শিম যে কার্যকরী ফিল্টার ইন্টারফেসে প্রতিনিধিরূপে হলো, এটি আপনার স্প্রিং অ্যাপ্লিকেশনে একটি শিম (" লক্ষ্য শিম "বা" প্রতিনিধি ") খুঁজে বের করে" প্রসঙ্গ এবং এটি প্রার্থনা। কিভাবে এটা সম্ভব? যেহেতু এই বিনটি জাভ্যাক্স.সারলেট.ফিল্টার প্রয়োগ করে, এর ডুফিল্টার পদ্ধতিটি বলা হয়।

কোন শিম বলা হয়? ডেলিগেটিংফিল্টারপ্রক্সি "একটি" টার্গেটবিয়ান নাম "সমর্থন করে [...], স্প্রিং অ্যাপ্লিকেশন প্রসঙ্গে লক্ষ্য বিনের নাম উল্লেখ করে।"

যেমন আপনি আপনার ওয়েব.এক্সএমএল এ দেখেছেন যে শিমের নাম " স্প্রিংসিকিউরিটিফিল্টারচেইন "

সুতরাং, একটি ওয়েব অ্যাপ্লিকেশন প্রসঙ্গে, একটি ফিল্টার আপনার আবেদনের প্রসঙ্গে "স্প্রিংসিকিউরিটিফিল্টারচেইন" নামে একটি মটরশুটি ইনস্ট্যান্ট করে এবং তারপরে ডু ফিল্টার () পদ্ধতির মাধ্যমে এটিতে প্রতিনিধি প্রেরণ করে।

মনে রাখবেন, আপনার অ্যাপ্লিকেশন প্রসঙ্গটি সমস্ত অ্যাপ্লিকেশন-কনটেক্সট (এক্সএমএল) ফাইল দিয়ে সংজ্ঞায়িত করা হয়েছে। উদাহরণস্বরূপ: applicationContext.xML এবং অ্যাপ্লিকেশনকন্টেক্সট-সিকিউরিটি.এক্সএমএল।

সুতরাং পরবর্তীকালে "স্প্রিংসিকিউরিটিফিল্টারচেইন" নামে একটি বিন সন্ধান করার চেষ্টা করুন ...

... এবং সম্ভবত আপনি পারবেন না (উদাহরণস্বরূপ যদি আপনি কোনও টিউটোরিয়াল অনুসরণ করেন বা আপনি যদি রু ব্যবহার করে সুরক্ষাটি কনফিগার করেন)

এখানে যাদুটি রয়েছে: সুরক্ষাটি কনফিগার করার জন্য এখানে একটি নতুন উপাদান রয়েছে like

<http auto-config="true" use-expressions="true"> 

এটি http://www.springframework.org/schema/security/spring-security-3.0.xsd দ্বারা অনুমোদিত হিসাবে , কৌশলটি করবে।

স্প্রিং যখন এক্সএমএল ফাইলগুলি ব্যবহার করে অ্যাপ্লিকেশন প্রসঙ্গটি লোড করে, এটি কোনও উপাদান খুঁজে পেলে এটি এইচটিটিপি সুরক্ষা স্থাপন করার চেষ্টা করবে, এটি একটি ফিল্টার স্ট্যাক এবং সুরক্ষিত ইউআরএল এবং "স্প্রিংসিকিউরিটি ফিল্টারচেইন" নামক ফিল্টারচেইনপ্রক্সিকে নিবন্ধিত করার চেষ্টা করবে।

বিকল্পভাবে, আপনি ক্লাসিক উপায়ে শিমের সংজ্ঞা দিতে পারেন, তা হ'ল:

<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">

তবে এটির চেয়ে কম প্রস্তাব দেওয়া হয়েছে, যেহেতু আপনাকে প্রচুর কনফিগারেশন করতে হবে (সমস্ত ফিল্টার যা আপনি ব্যবহার করছেন And এবং এর মধ্যে এক ডজনেরও বেশি রয়েছে)


"অ্যাপ্লিকেশনকন্টেক্সট-সিকিউরিটি.এক্সএমএল এবং অ্যাপ্লিকেশন কনটেক্সট-সিকিউরিটি.এক্সএমএল" একই ফাইলের নাম দু'বার।
musiKk

ধন্যবাদ মুসিকেক (আমার মনে হয় আপনি পোস্টটি সরাসরি সম্পাদনা করতে পারবেন)
jbbarquero

এটি সেই ব্যাখ্যাটি ছিল যে আমি সমস্ত দিকে তাকিয়ে ছিল এবং আমার জন্য জিনিসগুলি সাফ করে দিয়েছিল।
ব্যবহারকারী 87161611

@ জববারকোয়েরো: আপনি ঠিক বলেছেন তবে সঠিক সংস্করণটি কী হবে তা আমি নিশ্চিত ছিলাম না। আমি অনিচ্ছাকৃতভাবে অর্থ পরিবর্তন না করার জন্য মূল লেখকের পক্ষে এটি ঠিক করার প্রবণতা রয়েছে।
musiKk

ঠিক আছে. যাই হোক না কেন, আমি আমার প্রতিক্রিয়া উন্নত করতে আপনার অনেক ধন্যবাদ। আবার ধন্যবাদ, musiKk
jbbarquero

73

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

ডেলিগেটিং ফিল্টারপ্রক্সি প্রবেশ করুন। আপনি একটি ফিল্টার বাস্তবায়ন লেখেন এবং এটিকে একটি স্প্রিং বিন বানাবেন তবে ওয়েব.এক্সএমএমএলে আপনার নিজের ফিল্টার ক্লাস যুক্ত করার পরিবর্তে আপনি ডেলিগেটিংফিল্টারপ্রক্সি ব্যবহার করেন এবং বসন্তের প্রসঙ্গে আপনার ফিল্টারটির শিমের নাম দিন। (যদি আপনি স্পষ্টরূপে কোনও নাম সরবরাহ না করেন তবে এটি "ফিল্টার-নাম" ব্যবহার করে run) তারপরে রানটাইম এ, ডেলিগেটিং ফিল্টারপ্রক্সি আসল বাস্তবায়নটি খুঁজে পাওয়ার জটিলতা পরিচালনা করে - যা আপনি বসন্তে লিখেছিলেন এবং কনফিগার করেছেন - এবং এটিতে অনুরোধগুলি অনুরোধ করে । রানটাইমের সময়, এটি দেখে মনে হয় আপনি নিজের ফিল্টারটি ওয়েব.এক্সএমএমএলে তালিকাভুক্ত করেছেন, তবে অন্য স্প্রিং শিমের মতো এটির তারে সক্ষম হওয়ায় আপনি সুবিধা পাবেন।

যদি আপনি সেই ওয়েব ফিল্টার ম্যাপিং আপনার ওয়েব.এক্সএমএল থেকে বের করেন তবে সবকিছু কাজ চালিয়ে যাবে, তবে আপনার কোনও ইউআরএলই সুরক্ষিত হবে না। (এটি "স্প্রিংসিকিউরিটি ফিল্টারচেইন" নামটি ধরে নিয়েছে যা এটি কী করে তা নির্ভুলভাবে বর্ণনা করে)) কারণ এই ম্যাপিংটি প্রতিটি আগত অনুরোধকে ফিল্টার করে এবং এটি আপনার বসন্ত প্রসঙ্গে বর্ণিত একটি সুরক্ষা ফিল্টারে তুলে দিচ্ছে।


এই আলোকিত মন্তব্য পোস্ট করার জন্য ধন্যবাদ। আমি এখন স্প্রিং সিকিউরিটি শিখছি, কাস্টমাইজেশন করার জন্য এটি যথেষ্ট বোঝার চেষ্টা করছি। সার্ভলেট ফিল্টারগুলি কী বা স্প্রিংস ফিল্টারগুলি কী তা আমার কোনও ধারণা ছিল না। এওপি সম্পর্কে আপনার বিট এটি পরিষ্কার করে দেয় যে কেবল সার্লেলেট ব্যবহার না করে যে কোনও একটিতে ফিল্টার থাকবে কেন ........ সুতরাং আপনাকে প্রতিটি সার্লেট / উত্সে বার বার একই প্রাক / পোস্ট প্রসেসিং লিখতে হবে না
স্টিভ

কি দারুন. এই ব্যাখ্যাটি আমার যা প্রয়োজন তা ঠিক। আপনার জ্ঞান ভাগাভাগি করার জন্য ধন্যবাদ।
চার্লস মরিন

@ রায়ান স্টুয়ার্ট যদি আমার দুটি মটরশুটি প্রয়োগ থাকে তবে অ্যাপ্লিকেশন কনটেক্সটে ফিল্টার ইন্টারফেস রয়েছে এবং আমি একটি ক্রম সম্পাদন করতে চাই, তবে আমি কীভাবে এটি তৈরি করতে পারি?
অভিষেক নায়ক

@ স্কাফম্যান যদি আমার কাছে দুটি মটরশুটি প্রয়োগ থাকে তবে অ্যাপ্লিকেশন কনটেক্সটে ফিল্টার ইন্টারফেস রয়েছে এবং আমি একটি ক্রম সম্পাদন করতে চাই, তবে আমি কীভাবে এটি তৈরি করতে পারি?
অভিষেক নায়ক

44

সার্লেটলেট ফিল্টার কি?

সার্ভলেট ফিল্টারগুলি সাধারণভাবে একটি জাভা ওয়েব অ্যাপ্লিকেশন ধারণা। আপনার অ্যাপ্লিকেশনটিতে স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করা হোক বা না হোক আপনার কোনও ওয়েব অ্যাপে সার্লেট ফিল্টার থাকতে পারে।

এই ফিল্টারগুলি লক্ষ্য servlet পৌঁছানোর আগে অনুরোধগুলি বাধা দিতে পারে। সার্ভলেট ফিল্টারগুলিতে আপনি অনুমোদনের মতো সাধারণ কার্যকারিতা বাস্তবায়ন করতে পারেন। একবার কার্যকর হয়ে গেলে, আপনি আপনার ওয়েব.এক্সএমএলে ফিল্টারটি একটি নির্দিষ্ট সার্লেট, নির্দিষ্ট অনুরোধ url প্যাটার্ন বা সমস্ত url প্যাটার্নে প্রয়োগ করতে পারেন ure

সার্লেটলেট ফিল্টারগুলি কোথায় ব্যবহৃত হয়?

আধুনিক ওয়েব অ্যাপ্লিকেশনগুলিতে এমন কয়েক ডজন ফিল্টার থাকতে পারে। অনুমোদন, ক্যাশিং, ওআরএম সেশন ম্যানেজমেন্ট এবং নির্ভরতা ইনজেকশনের মতো জিনিসগুলি প্রায়শই সার্লেট ফিল্টারের সহায়তায় প্রয়োগ করা হয়। এই সমস্ত ফিল্টার নিবন্ধিত করা প্রয়োজন web.xml

সার্ভলেট ফিল্টার ইনস্ট্যান্ট করছে - স্প্রিং ফ্রেমওয়ার্ক ছাড়াই

আপনার সার্লেট ধারকটি ঘোষিত ফিল্টারগুলির উদাহরণ তৈরি web.xmlকরে এবং উপযুক্ত সময়ে তাদের কল করে (যেমন, সার্লেটের অনুরোধগুলি পরিবেশন করার সময়)। এখন আপনি যদি ডিপেন্ডেন্সি ইনজেকশন (ডিআই) ভক্তদের বেশিরভাগের মতো হন তবে আপনি সম্ভবত বলবেন যে দৃষ্টান্তগুলি তৈরি করা আমার ডিআই ফ্রেমওয়ার্ক (স্প্রিং) আরও ভাল করে। আমি কি আমার সার্লেট ফিল্টারগুলি স্প্রিংয়ের সাথে তৈরি করতে পারি না যাতে তারা সমস্ত ডিআই ধার্মিকতার জন্য উপযুক্ত হয়?

DelegatingFilterProxy, যাতে বসন্ত আপনার ফিল্টার দৃষ্টান্ত তৈরি করে

এই DelegatingFilterProxyস্থানে পদক্ষেপগুলি DelegatingFilterProxyহ'ল javax.servlet.Filterস্প্রিং ফ্রেমওয়ার্ক দ্বারা সরবরাহ করা ইন্টারফেসের একটি প্ররোচনা । আপনি একবার DelegatingFilterProxyওয়েব.এক্সএমএল কনফিগার করার পরে আপনি আসল মটরশুটিগুলি ঘোষণা করতে পারেন যা আপনার বসন্তের কনফিগারেশনে ফিল্টারিং করে। এইভাবে, বসন্তটি মটরশুটিগুলির উদাহরণ তৈরি করে যা প্রকৃত ফিল্টারিং করে এবং আপনি এই মটরশুটিটি কনফিগার করতে ডিআই ব্যবহার করতে পারেন।

মনে রাখবেন যে আপনার কেবলমাত্র একটি একক DelegatingFilterProxyঘোষণার প্রয়োজন web.xmlতবে beanআপনার প্রয়োগের প্রসঙ্গে আপনি কয়েকটি ফিল্টারিং এক সাথে জড়িত থাকতে পারেন ।


খুব ভাল ব্যাখ্যা।
ব্যবহারকারী4906240

15

জিনিসটি হ'ল সার্ভলেট ফিল্টারগুলি সার্লেট পাত্রে পরিচালিত হয়, বসন্তের দ্বারা নয়। এবং আপনার ফিল্টারগুলিতে আপনাকে কিছু বসন্ত উপাদান ইনজেকশনের প্রয়োজন হতে পারে।

সুতরাং, আপনার যদি এমন কিছু প্রয়োজন হয়:

public class FooFilter {

    @Inject
    private FooService service;

    public void doFilter(....) { .. }

}

তারপরে আপনার প্রতিনিধি ফিল্টার প্রক্সি প্রয়োজন।


1

আপনি 'আঠালো' স্টাফ সম্পর্কে ঠিক বলেছেন। ফিল্টারচেইনপ্রক্সির জাভাডক্সে যেমন লেখা হয়েছে :

ফিল্টারচেইনপ্রক্সি অ্যাপ্লিকেশন ওয়েব.এক্সএমএল ফাইলে একটি স্ট্রিং ডেলিগেটিংফিল্টারপ্রক্সি ডিক্লোরেশন যোগ করে সার্ভলেট কনটেইনার ফিল্টার চেইনে লিঙ্কযুক্ত।

একটি দুর্দান্ত ব্যাখ্যার জন্য দয়া করে স্প্রিং সিকিউরিটি নেমস্পেসের পিছনে ব্লগের ফিল্টারচেইনপ্রক্সি বিভাগটি দেখুন ।


0

আমি ওয়েব.এক্সএমএলে "স্প্রিংসিকিউরিটিফিল্টারচেইন" দেখে হতবাক হয়েছি এবং স্প্রিংফ্রেমওয়ার্ক সুরক্ষা নথিতে এই উত্তরটি পেয়েছি:

<http>উপাদান আপনার আবেদনের ওয়েব স্তরের জন্য নিরাপত্তা কনফিগারেশন encapsulates। > এটি "স্প্রিংসিকিউরিটিফিল্টারচেইন" নামে একটি ফিল্টারচাইন প্রক্সি বিন তৈরি করে যা ওয়েব সুরক্ষা কনফিগারেশন তৈরির ক্ষেত্রে> সুরক্ষা ফিল্টারগুলির স্ট্যাক বজায় রাখে [19]। কিছু মূল ফিল্টার সর্বদা> তৈরি হয় এবং অন্যরা উপস্থিত থাকা শিশু উপাদানগুলির উপর নির্ভর করে স্ট্যাকের সাথে যুক্ত করা হবে> স্ট্যান্ডার্ড ফিল্টারগুলির অবস্থানগুলি স্থির করা হয় (ফ্রেমওয়ার্কের পূর্ববর্তী সংস্করণগুলির সাথে ত্রুটির একটি সাধারণ উত্স সরিয়ে>> নেমস্পেসের পরিচিতিতে ফিল্টার অর্ডার সারণী দেখুন)> যখন ফিল্টারচেইনপ্রক্স বিনে ব্যবহারকারীরা ফিল্টার চেইনকে স্পষ্টভাবে কনফিগার করতে হয়েছিল। আপনার যদি কনফিগারেশনের পুরো নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনি অবশ্যই এটি করতে পারেন।

এখানে লিঙ্কটি http://docs.spring.io/spring-security/site/docs/3.0.x/references/appendix-namespace.html


0

এটি অনেক দিন হয়ে গেছে তবে আমার একই প্রশ্ন ছিল এবং আমি এটি পেয়েছি: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html

আমি আমার বসন্ত সুরক্ষা প্রকল্পটি চালানোর চেষ্টা করেছি প্রশ্নযুক্ত ফিল্টারটি সরিয়ে এবং এটি যুক্ত করে by আমি যা খুঁজে পেয়েছি তা হল যদি আমরা ফিল্টারটি যুক্ত করি তবে কেবলমাত্র কলটি বসন্ত-সুরক্ষা কনফিগারেশনের সংজ্ঞায়িত হিসাবে প্রয়োজনীয় লগইন পৃষ্ঠায় পুনর্নির্দেশ করবে।

সুতরাং, @ রায়ান এর উত্তরে সম্মত হচ্ছেন।

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