স্প্রিং সিকিউরিটি ফিল্টার চেইন একটি খুব জটিল এবং নমনীয় ইঞ্জিন।
শৃঙ্খলে মূল ফিল্টারগুলি (ক্রমে)
- সিকিউরিটি কনটেক্সট পার্সনিস্টি ফিল্টার (জেএসসিএসআইআইএনআইডি থেকে প্রমাণীকরণ পুনরুদ্ধার করে)
- ব্যবহারকারীনাম পাসওয়ার্ডআউটেন্টিফিকেশন ফিল্টার (প্রমাণীকরণ সম্পাদন করে)
- ব্যতিক্রম ট্রান্সলেশন ফিল্টার (ফিল্টারসিকিউরিটি ইন্টারসেপ্টার থেকে সুরক্ষা ব্যতিক্রমগুলি ধরুন)
- ফিল্টারসিকিউরিটি ইন্টারসেপ্টার (প্রমাণীকরণ এবং অনুমোদনের ব্যতিক্রম ছুঁড়ে ফেলতে পারে)
এ খুঁজছি বর্তমান স্থিতিশীল রিলিজ 4.2.1 ডকুমেন্টেশন , বিভাগ 13.3 ফিল্টার ক্রমানুসার আপনি পুরো ফিল্টার শৃঙ্খল এর ফিল্টার সংগঠন দেখতে পারে:
13.3 ফিল্টার অর্ডারিং
ফিল্টারগুলি শৃঙ্খলে সংজ্ঞায়িত করা খুব গুরুত্বপূর্ণ very আপনি আসলে যে ফিল্টারটি ব্যবহার করছেন তা নির্বিশেষে ক্রমটি নিম্নরূপ হওয়া উচিত:
চ্যানেলপ্রসেসিংফিল্টার , কারণ এটির জন্য অন্য কোনও প্রোটোকলে পুনর্নির্দেশের প্রয়োজন হতে পারে
সিকিউরিটি কনটেক্সটপার্সিস্টিস্ট ফিল্টার, সুতরাং ওয়েব রিকুয়েস্টের শুরুতে সিকিউরিটি কনটেক্সটহোল্ডারে একটি সিকিউরিটি কনটেক্সট স্থাপন করা যেতে পারে, এবং ওয়েব রিকোয়েস্ট শেষ হয়ে গেলে সিকিউরিটি কনটেক্সট-এ যে কোনও পরিবর্তন করা যাবে তা অনুলিপি করা যাবে (পরবর্তী ওয়েব অনুরোধের সাথে ব্যবহারের জন্য প্রস্তুত)
সমকালীন সেশনফিল্টার, কারণ এটি সিকিউরিটি কনটেক্সটহোল্ডার কার্যকারিতা ব্যবহার করে এবং অধ্যক্ষের কাছ থেকে চলমান অনুরোধগুলি প্রতিবিম্বিত করতে সেশনরেজিস্ট্রি আপডেট করতে হবে
প্রমাণীকরণ প্রক্রিয়াকরণ মেকানিজম -
UsernamePasswordAuthenticationFilter , CasAuthenticationFilter ,
BasicAuthenticationFilter ইত্যাদি - তাই SecurityContextHolder একটি বৈধ প্রমাণীকরণ অনুরোধ টোকেন ধারণ করার জন্য পরিবর্তিত করা যায় যে
SecurityContextHolderAwareRequestFilter , আপনি আপনার সার্ভলেট ধারক মধ্যে একটি বসন্ত সিকিউরিটি সচেতন HttpServletRequestWrapper ইনস্টল করতে এটি ব্যবহার করছেন কিনা তা
JaasApiIntegrationFilter , যদি একটি JaasAuthenticationToken SecurityContextHolder হয় এই JaasAuthenticationToken বিষয় যেমন FilterChain প্রক্রিয়া হবে
রিমেমমিউথেন্টিকেশন ফিল্টার , যাতে যদি আগের কোনও প্রমাণীকরণ প্রক্রিয়াজাতকরণ ব্যবস্থাটি সুরক্ষা কনটেক্সটহোল্ডার আপডেট না করে এবং অনুরোধটি একটি কুকি উপস্থাপন করে যা স্মরণে-আমাকে পরিষেবাগুলি কার্যকর করতে সক্ষম করে, একটি উপযুক্ত স্মরণযোগ্য প্রমাণীকরণ বস্তু সেখানে রাখা হবে
অজ্ঞাতনামা প্রমাণীকরণ ফিল্টার , যাতে যদি পূর্বেকার কোনও প্রমাণীকরণ প্রক্রিয়া প্রক্রিয়া সিকিউরিটি কনটেক্সটহোল্ডার আপডেট না করে তবে একটি অনামী প্রমাণীকরণ বস্তু সেখানে রাখা হবে
এক্সপ্রেশন ট্রান্সলেশন ফিল্টার , যে কোনও স্প্রিং সিকিউরিটি ব্যতিক্রমগুলি ধরতে যাতে কোনও এইচটিটিপি ত্রুটির প্রতিক্রিয়া ফিরে আসে বা একটি উপযুক্ত প্রমাণীকরণএন্ট্রিপয়েন্টটি চালু করা যায়
ওয়েব ইউআরআইগুলি রক্ষা করতে এবং অ্যাক্সেস অস্বীকার করা হলে ব্যতিক্রমগুলি বাড়াতে ফিল্টারসিকিউরিটি ইন্টারসেপ্টর
এখন, আমি এক এক করে আপনার প্রশ্নগুলি চালিয়ে যাওয়ার চেষ্টা করব:
এই ফিল্টারগুলি কীভাবে ব্যবহৃত হয় তা নিয়ে আমি বিভ্রান্ত। এটি কি বসন্ত প্রদত্ত ফর্ম-লগইনের জন্য, ব্যবহারকারীর নামপাসওয়ার্ডআউটেনটিকেশন ফিল্টারটি কেবলমাত্র / লগইনের জন্য ব্যবহৃত হয়, এবং পরবর্তীকালে ফিল্টারগুলি হয় না? ফর্ম-লগইন নেমস্পেস উপাদানগুলি এই ফিল্টারগুলিকে স্বয়ংক্রিয়ভাবে কনফিগার করে? লগ-ইন ইউআরএল-এর প্রতিটি অনুরোধ (সত্যায়িত বা না) ফিল্টারসিকিউরিটি ইন্টারসেপ্টারে পৌঁছেছে?
একবার আপনি কোনও <security-http>
বিভাগটি কনফিগার করে নিলে প্রত্যেকের জন্য আপনাকে কমপক্ষে একটি প্রমাণীকরণ প্রক্রিয়া সরবরাহ করতে হবে। আমি অবশ্যই উল্লেখ করেছি স্প্রিং সিকিউরিটি ডকুমেন্টেশন থেকে 13.3 ফিল্টার অর্ডারিং বিভাগে 4 গ্রুপের সাথে মিলে যাওয়া ফিল্টারগুলির মধ্যে এটি অবশ্যই একটি।
এটি ন্যূনতম বৈধ সুরক্ষা: HTTP উপাদান যা কনফিগার করা যায়:
<security:http authentication-manager-ref="mainAuthenticationManager"
entry-point-ref="serviceAccessDeniedHandler">
<security:intercept-url pattern="/sectest/zone1/**" access="hasRole('ROLE_ADMIN')"/>
</security:http>
কেবল এটি করা যায়, এই ফিল্টারগুলি ফিল্টার চেইন প্রক্সিতে কনফিগার করা হয়েছে:
{
"1": "org.springframework.security.web.context.SecurityContextPersistenceFilter",
"2": "org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter",
"3": "org.springframework.security.web.header.HeaderWriterFilter",
"4": "org.springframework.security.web.csrf.CsrfFilter",
"5": "org.springframework.security.web.savedrequest.RequestCacheAwareFilter",
"6": "org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter",
"7": "org.springframework.security.web.authentication.AnonymousAuthenticationFilter",
"8": "org.springframework.security.web.session.SessionManagementFilter",
"9": "org.springframework.security.web.access.ExceptionTranslationFilter",
"10": "org.springframework.security.web.access.intercept.FilterSecurityInterceptor"
}
দ্রষ্টব্য: আমি একটি সাধারণ রেস্টকন্ট্রোলার তৈরি করে এটি পেয়েছি যা @ ফিল্টারচেইনপ্রক্সিকে সমর্থন করে এবং এর সামগ্রীগুলি ফেরত দেয়:
@Autowired
private FilterChainProxy filterChainProxy;
@Override
@RequestMapping("/filterChain")
public @ResponseBody Map<Integer, Map<Integer, String>> getSecurityFilterChainProxy(){
return this.getSecurityFilterChainProxy();
}
public Map<Integer, Map<Integer, String>> getSecurityFilterChainProxy(){
Map<Integer, Map<Integer, String>> filterChains= new HashMap<Integer, Map<Integer, String>>();
int i = 1;
for(SecurityFilterChain secfc : this.filterChainProxy.getFilterChains()){
//filters.put(i++, secfc.getClass().getName());
Map<Integer, String> filters = new HashMap<Integer, String>();
int j = 1;
for(Filter filter : secfc.getFilters()){
filters.put(j++, filter.getClass().getName());
}
filterChains.put(i++, filters);
}
return filterChains;
}
এখানে আমরা দেখতে পেলাম যে কেবলমাত্র <security:http>
একটি ন্যূনতম কনফিগারেশন দিয়ে উপাদানটি ঘোষণার মাধ্যমে সমস্ত ডিফল্ট ফিল্টার অন্তর্ভুক্ত রয়েছে তবে সেগুলির কোনওটিই প্রমাণীকরণের ধরণের নয় (১৩.৩ ফিল্টার অর্ডারিং বিভাগে চতুর্থ দল)। সুতরাং এর প্রকৃত অর্থ হ'ল security:http
উপাদানটি ঘোষণার মাধ্যমে , সিকিউরিটি কনটেক্সটপ্সারস্টিফিল্টার, এক্সসেপশন ট্রান্সলেশনফিল্টার এবং ফিল্টারসিকিউরিটিআইনটারসেপ্টর স্বয়ংক্রিয়ভাবে কনফিগার করা হয়েছে।
প্রকৃতপক্ষে, একটি প্রমাণীকরণ প্রক্রিয়াজাতকরণ প্রক্রিয়াটি কনফিগার করা উচিত, এবং এমনকি সুরক্ষা নেমস্পেস শিম প্রসেসিং দাবি করে, প্রারম্ভকালে একটি ত্রুটি ছুঁড়ে ফেলে তবে এটিকে এন্ট্রি-পয়েন্ট-রেফ বৈশিষ্ট্য যুক্ত করে বাইপাস করা যায় in <http:security>
আমি যদি <form-login>
কনফিগারেশনে একটি বেসিক যোগ করি তবে :
<security:http authentication-manager-ref="mainAuthenticationManager">
<security:intercept-url pattern="/sectest/zone1/**" access="hasRole('ROLE_ADMIN')"/>
<security:form-login />
</security:http>
এখন, ফিল্টারচেইনটি এরকম হবে:
{
"1": "org.springframework.security.web.context.SecurityContextPersistenceFilter",
"2": "org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter",
"3": "org.springframework.security.web.header.HeaderWriterFilter",
"4": "org.springframework.security.web.csrf.CsrfFilter",
"5": "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter",
"6": "org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter",
"7": "org.springframework.security.web.savedrequest.RequestCacheAwareFilter",
"8": "org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter",
"9": "org.springframework.security.web.authentication.AnonymousAuthenticationFilter",
"10": "org.springframework.security.web.session.SessionManagementFilter",
"11": "org.springframework.security.web.access.ExceptionTranslationFilter",
"12": "org.springframework.security.web.access.intercept.FilterSecurityInterceptor"
}
এখন, এই দুটি ফিল্টার org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter এবং org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter ফিল্টারকেইনপ্রক্সিতে তৈরি এবং কনফিগার করা হয়েছে।
সুতরাং, এখন, প্রশ্নগুলি:
এটি কি বসন্ত প্রদত্ত ফর্ম-লগইনের জন্য, ব্যবহারকারীর নামপাসওয়ার্ডআউটেনটিকেশন ফিল্টারটি কেবলমাত্র / লগইনের জন্য ব্যবহৃত হয়, এবং পরবর্তীকালে ফিল্টারগুলি হয় না?
হ্যাঁ, অনুরোধটি যদি ব্যবহারকারীর নাম পাসওয়ার্ডআউটথেন্টিকেশন ফিল্টার url এর সাথে মিলে যায় তবে লগইন প্রক্রিয়াকরণ প্রক্রিয়াটি সম্পূর্ণ করার চেষ্টা করার জন্য এটি ব্যবহৃত হয়। এই urlটি প্রতিটি অনুরোধের সাথে মিলে যাওয়ার জন্য এটির আচরণটি কনফিগার করা বা এমনকি পরিবর্তন করা যেতে পারে।
আপনারও একই ফিল্টারচেইনপ্রক্সিতে (যেমন এইচটিটিপিবাসিক, সিএএস, ইত্যাদি) কনফিগার করা একাধিক প্রমাণীকরণ প্রক্রিয়াজাতকরণ প্রক্রিয়া থাকতে পারে।
ফর্ম-লগইন নেমস্পেস উপাদানগুলি এই ফিল্টারগুলিকে স্বয়ংক্রিয়ভাবে কনফিগার করে?
না, ফর্ম-লগইন উপাদানটি ব্যবহারকারীর নামপাসওয়ার্ডএউথেন্টিকেশন ফিল্টারটি কনফিগার করে এবং আপনি লগইন-পৃষ্ঠা ইউআরএল সরবরাহ না করার ক্ষেত্রে এটি org.springframework.security.web.authentication.ui.DifaultLoginPageGeneratingFilter কনফিগারও করে, যা একটি সাধারণ স্বয়ংক্রিয়ভাবে তৈরি লগইনে শেষ হয় পাতা।
অন্যান্য ফিল্টারগুলি <security:http>
কোনও security:"none"
বৈশিষ্ট্য ছাড়াই একটি উপাদান তৈরি করে ডিফল্টরূপে স্বয়ংক্রিয়ভাবে কনফিগার করা হয় ।
লগ-ইন ইউআরএল-এর প্রতিটি অনুরোধ (সত্যায়িত বা না) ফিল্টারসিকিউরিটি ইন্টারসেপ্টারে পৌঁছেছে?
প্রতিটি অনুরোধ এটিতে পৌঁছানো উচিত, কারণ এটি অনুরোধটি অনুরোধ করা ইউআরএল-এ পৌঁছানোর অধিকার রাখে কি না তা সেই উপাদানটি যত্নশীল। তবে এর আগে প্রক্রিয়াজাত কিছু ফিল্টার কেবল কল না করে ফিল্টার চেইন প্রসেসিং বন্ধ করে দিতে পারে FilterChain.doFilter(request, response);
। উদাহরণস্বরূপ, কোনও সিএসআরএফ ফিল্টার ফিল্টার চেইন প্রসেসিং বন্ধ করতে পারে যদি অনুরোধটির সিএসআরএফ প্যারামিটার না থাকে।
লগইন থেকে পুনরুদ্ধার করা JWT- টোকেন দিয়ে আমি যদি আমার REST এপিআই সুরক্ষিত করতে চাই তবে কী হবে? আমাকে দুটি নেমস্পেস কনফিগারেশন HTTP ট্যাগ কনফিগার করতে হবে, অধিকার? UsernamePasswordAuthenticationFilter
অন্যের সাথে / লগইন করার জন্য , এবং অন্যটি কাস্টম সহ আরএসটি ইউআরএল এর জন্য JwtAuthenticationFilter
।
না, আপনাকে এইভাবে বাধ্য করা হবে না। আপনি উভয় UsernamePasswordAuthenticationFilter
এবং JwtAuthenticationFilter
একই HTTP উপাদানগুলিতে ঘোষণা করতে পারেন , তবে এটি এই ফিল্টারগুলির প্রতিটিের কংক্রিট আচরণের উপর নির্ভর করে। উভয় পন্থাই সম্ভব এবং কোনটি ফাইনিকভাবে চয়ন করতে হবে তা নিজের পছন্দগুলির উপর নির্ভর করে।
দুটি HTTP উপাদান কনফিগার করে দুটি বসন্তসিকিউরিটিফিটলারচেনগুলি তৈরি করে?
হ্যা, এটা সত্য
আমি ফর্ম-লগইন ঘোষণা না করা অবধি কি ব্যবহারকারীর নামপ্যাসওয়ার্ডঅথেন্টিকেশন ফিল্টারটি ডিফল্টরূপে বন্ধ থাকে?
হ্যাঁ, আপনি এটি পোস্ট করেছেন এমন প্রতিটি কনফিগারেশনের উত্পন্ন ফিল্টারগুলিতে আপনি এটি দেখতে পেলেন
সিকিউরিটি কনটেক্সট পার্সনিস্ট ফিল্টারকে আমি কীভাবে এমন একটি দিয়ে প্রতিস্থাপন করব, যা জেএসসিআইডিআইডি-র পরিবর্তে বিদ্যমান জেডব্লিউটি-টোকেন থেকে প্রমাণীকরণ প্রাপ্ত করবে?
আপনি সিকিউরিটি কনটেক্সট পার্সনিস্টি ফিল্টার এড়াতে পারবেন, কেবল সেশনে কৌশল কনফিগার করে <http:element>
। কেবল এটির মতো কনফিগার করুন:
<security:http create-session="stateless" >
অথবা, এক্ষেত্রে আপনি এটিকে <security:http>
উপাদানটির ভিতরে অন্য ফিল্টার দিয়ে ওভাররাইট করতে পারেন :
<security:http ...>
<security:custom-filter ref="myCustomFilter" position="SECURITY_CONTEXT_FILTER"/>
</security:http>
<beans:bean id="myCustomFilter" class="com.xyz.myFilter" />
সম্পাদনা করুন:
"আপনার কাছে একই ফিল্টারচেইনপ্রক্সিতে কনফিগার করা একাধিক প্রমাণীকরণ প্রক্রিয়া পদ্ধতি থাকতে পারে" সম্পর্কে একটি প্রশ্ন। একাধিক (স্প্রিং বাস্তবায়ন) প্রমাণীকরণ ফিল্টার ঘোষণার পরে কি প্রথমটির দ্বারা সম্পাদিত প্রমাণীকরণটি ওভাররাইট করা হবে? এটি একাধিক প্রমাণীকরণ সরবরাহকারী থাকার সাথে কীভাবে সম্পর্কিত?
এটি শেষ পর্যন্ত প্রতিটি ফিল্টার নিজেই বাস্তবায়নের উপর নির্ভর করে, তবে এটি সত্য যে পরেরটি প্রমাণীকরণ ফিল্টারগুলি অন্তত পূর্ববর্তী ফিল্টারগুলি দ্বারা তৈরি পূর্ববর্তী প্রমাণীকরণের উপরে ওভাররাইট করতে সক্ষম হয়।
তবে এটি সম্ভবত ঘটে না। সুরক্ষিত আরআরএসটি পরিষেবাদিতে আমার কিছু প্রোডাকশন কেস রয়েছে যেখানে আমি একধরণের অনুমোদনের টোকেন ব্যবহার করি যা এইচটিপিপি শিরোনাম হিসাবে বা অনুরোধ সংস্থার ভিতরে উভয়ই সরবরাহ করা যেতে পারে। সুতরাং আমি দুটি ফিল্টার কনফিগার করেছি যা সেই টোকেনটি পুনরুদ্ধার করে, একটি ক্ষেত্রে এইচটিপি হেডার থেকে এবং অন্যটি নিজস্ব বিশ্রামের অনুরোধের অনুরোধ সংস্থা থেকে। এটি সত্য যে কোনও HTTP অনুরোধটি যদি এইচটিটিপি শিরোনাম হিসাবে এবং অনুরোধ সংস্থার অভ্যন্তরে প্রমাণীকরণের টোকেন সরবরাহ করে তবে উভয় ফিল্টার এটি পরিচালকের কাছে অনুমোদনের প্রক্রিয়া চালানোর চেষ্টা করবে, তবে অনুরোধটি সহজেই তা পরীক্ষা করা এড়াতে পারে doFilter()
প্রতিটি ফিল্টারের পদ্ধতির সূচনাতে ইতিমধ্যে প্রমাণীকৃত ।
একাধিক প্রমাণীকরণ ফিল্টার থাকা একাধিক প্রমাণীকরণ সরবরাহকারী থাকার সাথে সম্পর্কিত, তবে এটি জোর করবেন না। আমি এর আগে প্রকাশ করেছি, আমার কাছে দুটি প্রমাণীকরণ ফিল্টার রয়েছে তবে আমার কাছে কেবলমাত্র একটি প্রমাণীকরণ প্রদানকারী রয়েছে, কারণ উভয় ক্ষেত্রেই প্রমাণীকরণ ব্যবস্থাপক এটিকে একই সরবরাহকারীর কাছে প্রেরণ করেন।
এবং এর বিপরীতে, আমারও একটি দৃশ্য আছে যেখানে আমি মাত্র একটি ব্যবহারকারী নাম পাসওয়ার্ডআউটেন্টিফিকেশন ফিল্টার প্রকাশ করি তবে ব্যবহারকারীর শংসাপত্রগুলি উভয়ই ডিবি বা এলডিএপ-এ থাকতে পারে, সুতরাং আমার কাছে দুটি ব্যবহারকারীনাম পাসওয়ার্ডআউটেন্টিফিকেশন টোকেন সমর্থনকারী সরবরাহকারী রয়েছে এবং প্রমাণীকরণম্যানেজার ফিল্টার থেকে সরবরাহকারীদের কাছে কোনও প্রমাণীকরণের প্রচেষ্টা প্রেরণ করে শংসাপত্রগুলি বৈধতা দেওয়ার জন্য সুরক্ষিত।
সুতরাং, আমি মনে করি এটি স্পষ্ট যে প্রমাণীকরণের ফিল্টারগুলির পরিমাণই প্রমাণীকরণের সরবরাহকারীর পরিমাণ নির্ধারণ করে না বা সরবরাহকারীর পরিমাণ ফিল্টারগুলির পরিমাণ নির্ধারণ করে।
এছাড়াও, ডকুমেন্টেশনে বলা হয়েছে সিকিউরিটি কনটেক্সট পার্সনিস্টি ফিল্টারটি সিকিউরিটি কনটেক্সট পরিষ্কার করার জন্য দায়বদ্ধ, যা গুরুত্বপূর্ণ থ্রেড পুলিং। আমি যদি এটিকে বাদ দিই বা কাস্টম বাস্তবায়ন সরবরাহ করি, আমাকে নিজেই পরিষ্কারটি বাস্তবায়ন করতে হবে, তাই না? চেইনটি কাস্টমাইজ করার সময় আরও কি একই রকম গটচ আছে?
আমি আগে এই ফিল্টারটি সাবধানতার সাথে দেখিনি, তবে আপনার শেষ প্রশ্নের পরে আমি এর বাস্তবায়নটি যাচাই করেছি এবং সাধারণত বসন্তে প্রায় সবকিছু কনফিগার, প্রসারিত বা ওভাররাইট করা যেতে পারে।
SecurityContextPersistenceFilter একটি প্রতিনিধিদের SecurityContextRepository বাস্তবায়ন SecurityContext জন্য অনুসন্ধান করুন। ডিফল্টরূপে, এইচটিটিপিএসশনসিকিউরিটি কনটেক্সটরোপোসিটরি ব্যবহার করা হয়, তবে এটি ফিল্টারটির অন্যতম নির্মাতা ব্যবহার করে পরিবর্তন করা যেতে পারে। সুতরাং এমন কোনও সুরক্ষাকন্টেক্সটরিপোসিটরি লিখতে ভাল যা আপনার প্রয়োজনের সাথে খাপ খায় এবং এটি এটিকে সুরক্ষা থেকে সমস্ত তৈরি করা শুরু করার পরিবর্তে এর আচরণগত প্রমাণিত হওয়ার উপর নির্ভর করে সিকিউরিটি কনটেক্সটপ্সারস্টিস্ট ফিল্টারটিতে কনফিগার করে।