স্প্রিং সিকিউরিটি ফিল্টার চেইন কীভাবে কাজ করে


136

আমি বুঝতে পারি যে স্প্রিং সিকিউরিটি ফিল্টারগুলির শৃঙ্খলে তৈরি করে, যা অনুরোধটিকে বাধা দেবে, প্রমাণীকরণ সনাক্ত করবে (অনুপস্থিত) করবে, প্রমাণীকরণের এন্ট্রি পয়েন্টে পুনর্নির্দেশ করবে বা অনুমোদনের পরিষেবাতে অনুরোধটি পাস করবে এবং শেষ পর্যন্ত অনুরোধটি সার্লেলে আঘাত করবে বা সুরক্ষা ব্যতিক্রম ছুঁড়ে দেবে (অননুমোদিত বা অননুমোদিত)। DelegatingFitlerProxy এই ফিল্টারগুলি একসাথে আঠালো করে। তাদের কার্য সম্পাদন করতে, এই ফিল্টার অ্যাক্সেস পরিষেবাদি যেমন ইউজারডেটেলস সার্ভিস এবং প্রমাণীকরণ ম্যানেজার

শৃঙ্খলে মূল ফিল্টারগুলি (ক্রমে)

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

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

লগইন থেকে পুনরুদ্ধার করা JWT- টোকেন দিয়ে আমি যদি আমার REST এপিআই সুরক্ষিত করতে চাই তবে কী হবে ? আমার দুটি নেমস্পেস কনফিগারেশন httpট্যাগ কনফিগার করতে হবে , অধিকার? একটির সাথে / লগইন করার জন্য UsernamePasswordAuthenticationFilterএবং অন্যটি কাস্টম সহ আরএসটি ইউআরএল এর জন্য JwtAuthenticationFilter

দুটি httpউপাদান কনফিগার করা দুটি তৈরি করে springSecurityFitlerChains? হয় UsernamePasswordAuthenticationFilterডিফল্টরূপে বন্ধ পরিণত না হওয়া পর্যন্ত আমি ঘোষণা form-login? বর্তমানের পরিবর্তে বিদ্যমান SecurityContextPersistenceFilterফিল্টারটি আমি কীভাবে প্রতিস্থাপন করব ?AuthenticationJWT-tokenJSESSIONID


ফিল্টারগুলির ডিফল্ট ক্রমটি org.springframework.security.config.annotation.web.builders.FilterComparator
ব্লেসেল

উত্তর:


210

স্প্রিং সিকিউরিটি ফিল্টার চেইন একটি খুব জটিল এবং নমনীয় ইঞ্জিন।

শৃঙ্খলে মূল ফিল্টারগুলি (ক্রমে)

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

এ খুঁজছি বর্তমান স্থিতিশীল রিলিজ 4.2.1 ডকুমেন্টেশন , বিভাগ 13.3 ফিল্টার ক্রমানুসার আপনি পুরো ফিল্টার শৃঙ্খল এর ফিল্টার সংগঠন দেখতে পারে:

13.3 ফিল্টার অর্ডারিং

ফিল্টারগুলি শৃঙ্খলে সংজ্ঞায়িত করা খুব গুরুত্বপূর্ণ very আপনি আসলে যে ফিল্টারটি ব্যবহার করছেন তা নির্বিশেষে ক্রমটি নিম্নরূপ হওয়া উচিত:

  1. চ্যানেলপ্রসেসিংফিল্টার , কারণ এটির জন্য অন্য কোনও প্রোটোকলে পুনর্নির্দেশের প্রয়োজন হতে পারে

  2. সিকিউরিটি কনটেক্সটপার্সিস্টিস্ট ফিল্টার, সুতরাং ওয়েব রিকুয়েস্টের শুরুতে সিকিউরিটি কনটেক্সটহোল্ডারে একটি সিকিউরিটি কনটেক্সট স্থাপন করা যেতে পারে, এবং ওয়েব রিকোয়েস্ট শেষ হয়ে গেলে সিকিউরিটি কনটেক্সট-এ যে কোনও পরিবর্তন করা যাবে তা অনুলিপি করা যাবে (পরবর্তী ওয়েব অনুরোধের সাথে ব্যবহারের জন্য প্রস্তুত)

  3. সমকালীন সেশনফিল্টার, কারণ এটি সিকিউরিটি কনটেক্সটহোল্ডার কার্যকারিতা ব্যবহার করে এবং অধ্যক্ষের কাছ থেকে চলমান অনুরোধগুলি প্রতিবিম্বিত করতে সেশনরেজিস্ট্রি আপডেট করতে হবে

  4. প্রমাণীকরণ প্রক্রিয়াকরণ মেকানিজম - UsernamePasswordAuthenticationFilter , CasAuthenticationFilter , BasicAuthenticationFilter ইত্যাদি - তাই SecurityContextHolder একটি বৈধ প্রমাণীকরণ অনুরোধ টোকেন ধারণ করার জন্য পরিবর্তিত করা যায় যে

  5. SecurityContextHolderAwareRequestFilter , আপনি আপনার সার্ভলেট ধারক মধ্যে একটি বসন্ত সিকিউরিটি সচেতন HttpServletRequestWrapper ইনস্টল করতে এটি ব্যবহার করছেন কিনা তা

  6. JaasApiIntegrationFilter , যদি একটি JaasAuthenticationToken SecurityContextHolder হয় এই JaasAuthenticationToken বিষয় যেমন FilterChain প্রক্রিয়া হবে

  7. রিমেমমিউথেন্টিকেশন ফিল্টার , যাতে যদি আগের কোনও প্রমাণীকরণ প্রক্রিয়াজাতকরণ ব্যবস্থাটি সুরক্ষা কনটেক্সটহোল্ডার আপডেট না করে এবং অনুরোধটি একটি কুকি উপস্থাপন করে যা স্মরণে-আমাকে পরিষেবাগুলি কার্যকর করতে সক্ষম করে, একটি উপযুক্ত স্মরণযোগ্য প্রমাণীকরণ বস্তু সেখানে রাখা হবে

  8. অজ্ঞাতনামা প্রমাণীকরণ ফিল্টার , যাতে যদি পূর্বেকার কোনও প্রমাণীকরণ প্রক্রিয়া প্রক্রিয়া সিকিউরিটি কনটেক্সটহোল্ডার আপডেট না করে তবে একটি অনামী প্রমাণীকরণ বস্তু সেখানে রাখা হবে

  9. এক্সপ্রেশন ট্রান্সলেশন ফিল্টার , যে কোনও স্প্রিং সিকিউরিটি ব্যতিক্রমগুলি ধরতে যাতে কোনও এইচটিটিপি ত্রুটির প্রতিক্রিয়া ফিরে আসে বা একটি উপযুক্ত প্রমাণীকরণএন্ট্রিপয়েন্টটি চালু করা যায়

  10. ওয়েব ইউআরআইগুলি রক্ষা করতে এবং অ্যাক্সেস অস্বীকার করা হলে ব্যতিক্রমগুলি বাড়াতে ফিল্টারসিকিউরিটি ইন্টারসেপ্টর

এখন, আমি এক এক করে আপনার প্রশ্নগুলি চালিয়ে যাওয়ার চেষ্টা করব:

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

একবার আপনি কোনও <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 জন্য অনুসন্ধান করুন। ডিফল্টরূপে, এইচটিটিপিএসশনসিকিউরিটি কনটেক্সটরোপোসিটরি ব্যবহার করা হয়, তবে এটি ফিল্টারটির অন্যতম নির্মাতা ব্যবহার করে পরিবর্তন করা যেতে পারে। সুতরাং এমন কোনও সুরক্ষাকন্টেক্সটরিপোসিটরি লিখতে ভাল যা আপনার প্রয়োজনের সাথে খাপ খায় এবং এটি এটিকে সুরক্ষা থেকে সমস্ত তৈরি করা শুরু করার পরিবর্তে এর আচরণগত প্রমাণিত হওয়ার উপর নির্ভর করে সিকিউরিটি কনটেক্সটপ্সারস্টিস্ট ফিল্টারটিতে কনফিগার করে।


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

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

1
@ টিউমাসটুইভোনেন আমি আপনার শেষ মন্তব্যে প্রশ্নগুলির পরে আমার উত্তরটি সম্পাদনা করেছি
জুলমিটু

1
@ জ্লুমিয়েটু জাভা টীকাতে ("/ ফিল্টারচেইন) এর অনুপস্থিত একটি উদ্ধৃতি রয়েছে । এছাড়াও আপনি এই পদ্ধতিটি কোথায় রাখবেন? আমি এটিকে একটি নিয়ামক হিসাবে যুক্ত করার চেষ্টা করেছি এবং আমার কাছে রয়েছে:No qualifying bean of type 'org.springframework.security.web.FilterChainProxy' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
দিমিত্রি কোপ্রিভা

@ বিগডং নিশ্চিত করে নিন যে আপনি ওয়েব.এক্সএমএল বা জাভা ওয়েব অ্যাপ্লিকেশন কনফিগারেশন এবং আপনার বসন্তের কনফিগারেশনে স্প্রিংসিকিউরিটি ফিল্টারচেইন ঘোষণা করেছেন। এই কোড স্নিপেটকে অবশ্যই আপনারা যেমন একটি কন্ট্রোলারে অন্তর্ভুক্ত করা উচিত। এবং হ্যাঁ, আপনি নিখোঁজ উক্তিটি সম্পর্কে
ক্ষোভ প্রকাশ করছেন

4

UsernamePasswordAuthenticationFilterকেবলমাত্র জন্য ব্যবহৃত হয় /login, এবং আধুনিক ফিল্টারগুলি না?

না, UsernamePasswordAuthenticationFilterপ্রসারিত হয় AbstractAuthenticationProcessingFilterএবং এর মধ্যে একটি রয়েছে RequestMatcher, এর অর্থ আপনি নিজের প্রসেসিং ইউআরএল সংজ্ঞায়িত করতে পারবেন, এই ফিল্টারটি কেবল RequestMatcherঅনুরোধ url এর সাথে মেলে, ডিফল্ট প্রসেসিং ইউআরএল হ'ল /login

পরবর্তীতে ফিল্টার এখনও অনুরোধ হ্যান্ডেল করতে পারেন UsernamePasswordAuthenticationFilter, executes chain.doFilter(request, response);

কোর ফিটরা সম্পর্কে আরও বিশদ

ফর্ম-লগইন নেমস্পেস উপাদানগুলি এই ফিল্টারগুলিকে স্বয়ংক্রিয়ভাবে কনফিগার করে?

UsernamePasswordAuthenticationFilterএর দ্বারা তৈরি করা হয় <form-login>, এগুলি হ'ল স্ট্যান্ডার্ড ফিল্টার অ্যালিয়াস এবং অর্ডারিং

লগ-ইন ইউআরএল-এর প্রতিটি অনুরোধ (সত্যায়িত বা না) ফিল্টারসিকিউরিটি ইন্টারসেপ্টারে পৌঁছেছে?

এটি আগের ফিটাররা সফল কিনা তা নির্ভর করে তবে FilterSecurityInterceptorএটি সাধারণত শেষতম ফিটার।

দুটি HTTP উপাদান কনফিগার করে দুটি বসন্তসিকিউরিটিফিটলারচেনগুলি তৈরি করে?

হ্যাঁ, প্রতিটি ফিটলারচেইনের একটি রয়েছে RequestMatcher, যদি RequestMatcherঅনুরোধটির সাথে মেলে, তবে অনুরোধটি ফিটার শৃঙ্খলে ফিটরা দ্বারা পরিচালিত হবে।

RequestMatcherআপনি যদি প্যাটার্নটি কনফিগার না করেন বা আপনি নির্দিষ্ট ইউআরএল ( <http pattern="/rest/**") কনফিগার করতে পারেন তবে ডিফল্ট সমস্ত অনুরোধের সাথে মেলে ।

আপনি যদি ফিটলারদের সম্পর্কে আরও কিছু জানাতে চান তবে আমি মনে করি আপনি বসন্ত সুরক্ষায় উত্স কোডটি চেক করতে পারেন। doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)


4

বসন্ত সুরক্ষা একটি ফিল্টার ভিত্তিক কাঠামো, এটি প্রক্সি ফিল্টার বা বসন্ত পরিচালিত মটরশুটিগুলির ক্ষেত্রে আপনার আবেদনের আগে একটি ওয়াল (এইচটিপি ফায়ারওয়াল) লাগায়। আপনার অনুরোধটি আপনার API এ পৌঁছাতে একাধিক ফিল্টার দিয়ে যেতে হবে।

স্প্রিং সিকিউরিটিতে কার্যকরকরণের ক্রম ence

  1. WebAsyncManagerIntegrationFilter সিকিউরিটি কনটেক্সট এবং স্প্রিং ওয়েবের ওয়েবঅ্যাসেন্সম্যানেজারের মধ্যে সংহতকরণ সরবরাহ করে।

  2. SecurityContextPersistenceFilterএই ফিল্টারটি কেবল অনুরোধ অনুযায়ী একবার কার্যকর করা হবে, অনুরোধের পূর্বে কনফিগার করা সুরক্ষা কনটেক্সটরিপোসিটরি থেকে প্রাপ্ত তথ্য সহ সিকিউরিটি কনটেক্সটহোল্ডারকে পপুলেট করে এবং অনুরোধটি সম্পন্ন হয়ে ও প্রসঙ্গ ধারককে সাফ করার পরে এটি পুনরায় সংগ্রহস্থলে সংরক্ষণ করে।
    অনুরোধ বিদ্যমান সেশনের জন্য চেক করা হয়। নতুন অনুরোধ পারেন, SecurityContext অন্য তৈরি হবে অনুরোধ অধিবেশন তারপর বিদ্যমান নিরাপত্তা প্রসঙ্গ respository থেকে প্রাপ্ত করা হবে থাকে

  3. HeaderWriterFilter বর্তমান প্রতিক্রিয়াতে শিরোনাম যুক্ত করতে ফিল্টার বাস্তবায়ন।

  4. LogoutFilterঅনুরোধ URL হলে /logout(ডিফল্ট কনফিগারেশনের জন্য) অথবা যদি অনুরোধ URL mathces RequestMatcherকনফিগার LogoutConfigurerতারপর

    • সুরক্ষা প্রসঙ্গ সাফ করে।
    • অধিবেশন অবৈধ
    • কনফিগার করা কুকির নাম সহ সমস্ত কুকি মুছে দেয় LogoutConfigurer
    • ডিফল্ট লগআউট সাফল্যের ইউআরএল /বা লগআউট সাফল্যের ইউআরএল কনফিগার করা বা লগআউট স্যাকসেসহ্যান্ডলার কনফিগার করাতে পুনঃনির্দেশ করে।
  5. UsernamePasswordAuthenticationFilter

    • লগইনপ্রসেসিং ইউআরএল ব্যতীত অন্য কোনও অনুরোধের জন্য এই ফিল্টারটি আরও প্রক্রিয়া করবে না তবে ফিল্টার চেইন কেবল অবিরত থাকবে।
    • যদি অনুরোধ করা URL টি মিল থাকে (অবশ্যই HTTP POST) ডিফল্ট হয় /loginবা মিলগুলি .loginProcessingUrl()কনফিগার করা থাকে FormLoginConfigurerতবে UsernamePasswordAuthenticationFilterপ্রমাণীকরণের চেষ্টা করে।
    • ডিফল্ট লগইন ফর্ম পরামিতি ব্যবহারকারীর নাম ও পাসওয়ার্ড হয়, দ্বারা ওভাররাইড করা যেতে পারে usernameParameter(String), passwordParameter(String)
    • ওভাররাইড ডিফল্ট সেট করা হচ্ছে.loginPage()
    • প্রমাণীকরণ চেষ্টা করার সময়
      • একটি Authenticationঅবজেক্ট ( UsernamePasswordAuthenticationTokenবা Authenticationআপনার কাস্টম প্রমাণীকরণ ফিল্টার ক্ষেত্রে কোনও প্রয়োগ ) তৈরি করা হয়।
      • এবং authenticationManager.authenticate(authToken)আহ্বান করা হবে
      • নোট করুন যে আমরা প্রচুর পরিমাণে AuthenticationProviderপ্রমাণীকরণ পদ্ধতি কনফিগার করতে পারি সমস্ত supportsপ্রবন্ধ সরবরাহকারীদের চেষ্টা করে এবং লেখক সরবরাহকারী authToken / প্রমাণীকরণ বস্তুর যে কোনওটিকে চেক করে , সমর্থনকারী লেখক সরবরাহকারী প্রমাণীকরণের জন্য ব্যবহৃত হবে। এবং সফল প্রমাণীকরণ অন্য ছোঁড়ার ক্ষেত্রে প্রমাণীকরণ বস্তুটি প্রদান করে AuthenticationException
    • যদি প্রমাণীকরণের সাফল্য সেশনটি তৈরি হয়ে যায় এবং অনুরোধ করা authenticationSuccessHandlerহবে যা লক্ষ্যযুক্ত ইউআরএলটি কনফিগার করা হয়েছে (ডিফল্ট হয় /)
    • যদি প্রমাণীকরণ ব্যর্থ হয় ব্যবহারকারী অন-প্রমাণীকৃত ব্যবহারকারী হয়ে যায় এবং চেইন অব্যাহত থাকে।
  6. SecurityContextHolderAwareRequestFilter, যদি আপনি এটি আপনার সার্লেটের ধারকটিতে একটি স্প্রিং সিকিউরিটি সচেতন HttpServletRequestWrapper ইনস্টল করতে ব্যবহার করছেন

  7. AnonymousAuthenticationFilterসিকিউরিটি কনটেক্সটহোল্ডারে কোনও প্রমাণীকরণ অবজেক্ট না থাকলে সনাক্ত করে, যদি কোনও প্রমাণীকরণের বস্তু পাওয়া না যায়, অনুমোদিত কর্তৃপক্ষ সহ Authenticationবস্তু ( AnonymousAuthenticationToken) তৈরি করে ROLE_ANONYMOUS। এখানে AnonymousAuthenticationTokenঅন-অনুমোদনপ্রাপ্ত ব্যবহারকারীদের পরবর্তী অনুরোধগুলি সনাক্তকরণে সহায়তা করে।

ডিবাগ লগ
DEBUG - /app/admin/app-config at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
DEBUG - Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@aeef7b36: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS' 
  1. ExceptionTranslationFilter, যে কোনও স্প্রিং সুরক্ষা ব্যতিক্রমগুলি ধরতে যাতে কোনও এইচটিটিপি ত্রুটির প্রতিক্রিয়া ফিরে আসে বা একটি উপযুক্ত প্রমাণীকরণ এন্ট্রিপয়েন্টটি চালু করা যায়

  2. FilterSecurityInterceptor
    থাকবে FilterSecurityInterceptorযা ফিল্টার শৃঙ্খল যা থেকে প্রমাণীকরণ বস্তুর পায় প্রায় গত আসে SecurityContextএবং মঞ্জুর পরার কর্তৃপক্ষ তালিকা (ভূমিকা মঞ্জুর) এবং একটি সিদ্ধান্ত কিনা এই অনুরোধ অনুরোধ করা সংস্থান বা না পৌঁছানোর অনুমতি করবে সিদ্ধান্তের সাথে মিলে যাওয়া দ্বারা তৈরি করা হয় অনুমোদিত AntMatchersকনফিগার করা HttpSecurityConfiguration

401-অননুমোদিত এবং 403- নিষিদ্ধ ব্যতিক্রমগুলি বিবেচনা করুন। এই সিদ্ধান্তগুলি ফিল্টার চেইনে সর্বশেষে করা হবে

  • অনুমোদনপ্রাপ্ত ব্যবহারকারী জনসাধারণের সংস্থান অ্যাক্সেস করতে চেষ্টা করছেন - অনুমোদিত owed
  • সুরক্ষিত সংস্থান অ্যাক্সেস করার চেষ্টা করছে এমন অনীকৃত ব্যবহারকারী - 401-অননুমোদিত
  • প্রমানিত ব্যবহারকারী নিষিদ্ধ সংস্থান (তার ভূমিকার জন্য সীমাবদ্ধ) অ্যাক্সেস করার চেষ্টা করছেন - 403-নিষিদ্ধ

নোট: ব্যবহারকারী অনুরোধ না শুধুমাত্র উল্লিখিত ফিল্টার উপরে প্রবাহিত, কিন্তু অন্যদের ফিল্টার খুব এখানে প্রদর্শিত হয়নি (। ConcurrentSessionFilter, RequestCacheAwareFilter, SessionManagementFilter...)
এটি বিভিন্ন যখন আপনি পরিবর্তে আপনার নিজস্ব প্রমাণীকরণ ফিল্টার ব্যবহার হতে হবে UsernamePasswordAuthenticationFilter
আপনি জেডব্লিউটি প্রমাণীকরণ ফিল্টারটি কনফিগার করেন এবং বাদ .formLogin() i.e, UsernamePasswordAuthenticationFilterদিলে এটি সম্পূর্ণ আলাদা হবে become


শুধু রেফারেন্সের জন্য। স্প্রিং-ওয়েব এবং স্প্রিং-সিকিউরিটিতে ফিল্টারগুলি
নোট: পিক্রে প্যাকেজের নাম উল্লেখ করুন , কেননা orm থেকে আমার ফিল্টার এবং আমার কাস্টম প্রয়োগ করা ফিল্টার রয়েছে।

এখানে চিত্র বর্ণনা লিখুন

ডকুমেন্টেশন থেকে ফিল্টারগুলির ক্রম হিসাবে অর্ডার দেওয়া হয়

  • ChannelProcessingFilter
  • ConcurrentSessionFilter
  • SecurityContextPersistenceFilter
  • LogoutFilter
  • X509AuthenticationFilter
  • AbstractPreAuthenticatedProcessingFilter
  • CasAuthenticationFilter
  • UsernamePasswordAuthenticationFilter
  • ConcurrentSessionFilter
  • OpenIDAuthenticationFilter
  • DefaultLoginPageGeneratingFilter
  • DefaultLogoutPageGeneratingFilter
  • ConcurrentSessionFilter
  • DigestAuthenticationFilter
  • BearerTokenAuthenticationFilter
  • BasicAuthenticationFilter
  • RequestCacheAwareFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RememberMeAuthenticationFilter
  • AnonymousAuthenticationFilter
  • SessionManagementFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor
  • SwitchUserFilter

আপনি
একটি আধুনিক ওয়েব অ্যাপ্লিকেশন প্রমাণীকরণের সর্বাধিক সাধারণ উপায় উল্লেখ করতে পারেন ?
স্প্রিং সুরক্ষা প্রসঙ্গে প্রমাণীকরণ এবং অনুমোদনের মধ্যে পার্থক্য?

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