somewhere in... blog
x
ফোনেটিক ইউনিজয় বিজয়

পোস্টটি যিনি লিখেছেন

রিমন রনবীর
প্রোগ্রামার হিসেবে কাজ করছি প্রায় চার পাঁচ বছর। কতটুকু ইঞ্জিন আর কতটুকু মানবিকতা ধারণ করছি জানি না, তবে আরেকটু বেশি মানবিকতা জাগ্রত করার অবিরাম প্রচেষ্টায় আছি।আমার লিঙ্কডইন প্রোফাইলঃ http://bd.linkedin.com/in/sayemkcn

আপনার জাভা অ্যাপের নিরাপত্তা কিভাবে নিশ্চিত করবেন?

০৫ ই ডিসেম্বর, ২০১৯ সন্ধ্যা ৬:৩৫
এই পোস্টটি শেয়ার করতে চাইলে :

 



১। ভূমিকা


 

স্প্রিং সিকিউরিটি জাভা  অ্যাপ্লিকেশনের নিরাপত্তা দেয়ার জন্য একটা ফ্রেমওয়ার্ক। এরকম আরও কয়েকটা ফ্রেমওয়ার্ক আছে যেমন  PicketLink, Apache Shiro, OOAC ইত্যাদি কিন্তু এর মধ্যে স্প্রিং সিকিউরিটিই সবচেয়ে বেশী জনপ্রিয়, এবং একটা ওয়েব অ্যাপের সিকিউরিটি দেয়ার জন্য য কিছু দরকার তার প্রায় সব কিছুই এই ফ্রেমওয়ার্কে পাওয়া যাবে। এবং শেখাটাও খুব সহজ।

 

এই আর্টিকেলে আমরা স্প্রিং সিকিউরিটি ফ্রেমওয়ার্ক দিয়ে একটা জাভা অ্যাপ্লিকেশনের বেসিক সিকিউরিটি ইমপ্লিমেন্ট করার চেষ্টা করবো। সিকিউরিটি কনফিগারেশন দুই উপায়ে আমরা লিখতে পারি। XML এবং জাভা কনফিগারেশন। এখানে জাভা কনফিগারেশনে বেসিক অথেনটিকেশন দেখানো হবে, যেহেতু Spring 3.5 থেকেই আমরা @Annotation বেইজড কনফিগারেশন লিখতে পারি এবং স্প্রিং বুটে সম্পূর্নই জাভা কনফিগারেশন ইউজ করা হয় কাজেই XML কনফিগারেশন অনেকটা আনঅফিসিয়ালি  ডেপ্রিকেটেড।

 

একটা বেসিক লগইন মেকানিজম দিয়ে আমাদের বেসিক সিকিউরিটি সিম্যুলেট করে দেখানো সহজ হবে। তার মানে হচ্ছে ওয়েব অ্যাপে এক্সেস করার জন্য ইউজারের একটা ইউজারনেম/ইমেইল এবং পাসওয়ার্ডের প্রয়োজন হবে।

 


২।  Maven/Gradle ডিপেন্ডেন্সি


 

স্প্রিং সিকিউরিটির জন্য সর্বপ্রথম আমাদেরকে স্প্রিং সিকিউরিটির ডিপেন্ডেন্সি ক্লাসপাথে অ্যাড করে নিতে হবে। স্প্রিং বুটে অ্যাপের জন্য এক্ষেত্রে আমি  spring-boot-starter-security অ্যাড করছি।

 

Maven:




Gradle:


compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '1.5.2.RELEASE'


 

আপনার  অ্যাপটি যদি স্প্রিং বুট দিয়ে ডেভেলপ করা হয়ে থাকে তবে শুধুমাত্র এই ডিপেন্ডেন্সি যুক্ত করলেই আপনার অ্যাপলিকেশনটিতে স্প্রিং সিকিউরিটি তার  হিরোইজম দেখানো শুরু করবে। Spring MVC অ্যাপ হলে আপনাকে web.xml ফাইলে  springSecurityFilterChain নামে একটা ফিল্টার বসাতে হবে যার ক্লাস হবে  org.springframework.web.filter.DelegatingFilterProxy। এবং একটা ফিল্টার ম্যাপিং। কনফিগারেশনটা হবে ঠিক এইরকমঃ

 





স্প্রিং সিকিউরিটি কিভাবে কাজ করে




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

 



 স্প্রিং সিকিউরিটি জাভা কনফিগারেশন




আপনি একটা স্প্রিং এর বিন তৈরি করবেন @Configuration Annotation দিয়ে, যেটাতে  WebSecurityConfigurerAdapter ক্লাসটা এক্সটেন্ড করতে হবে। @Configuration অ্যানোটেশন দেয়ার কারনে স্প্রিং এই ক্লাসটাকে কনফিগারেশন বিন হিসেবে রেজিস্টার করে নেবে।

 

WebSecurityConfigurerAdapter ক্লাসের বেশ কিছু মেথড আছে যেগুলা আমরা Override করতে পারবো। তার মধ্যে আমরা এখানে আপাতত তিনটা মেথড Override করবো।



void configure(WebSecurity web)

void configure(HttpSecurity http)

void configure(AuthenticationManagerBuilder auth)


 

 

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

 

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

 

জাভা কনফিগারেশটা দেখতে এরকম হবে


@Configuration
public class SecurityConfigAdapter extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web
                .ignoring()
                .antMatchers("/resources/**", "/fonts/**");
    }

 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()                 .antMatchers("/questions/**").hasRole("USER”)
                .antMatchers("/admin/**").hasAnyRole("ADMIN", "SUPER_ADMIN")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/login")
                .failureUrl("/login?error")
                .permitAll();
        http
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login")
                .deleteCookies("JSESSIONID")
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                  .inMemoryAuthentication()
                  .withUser("admin").password("password").roles("USER");    }
}


 

 

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

 

এখন আসি এখানে কিভাবে কি করা হয়েছে সেটা নিয়ে। প্রথম মেথডটাতে আমরা যা করলাম তার অর্থ হচ্ছে আমরা আমাদের /resource ফোল্ডারে যত ফাইল আছে সব কিছু সকল ইউজারের জন্য উন্মুক্ত করে দিলাম। কারন আপনি হয়তো  আপনার হোমপেইজে সব মানুষকে নিমন্ত্রণ জানাবেন, তারা লগইন না করেই আপনার ওয়েবসাইট নেড়েচেড়ে দেখবে, আপনার অ্যাপ সম্পর্কে তথ্য নেবে, কিন্তু রিসোর্স ফোলাডারের  html/css/js ফাইলগুলোতে  অ্যাক্সেস না থাকলে কিন্তু স্প্রিং ইউজারকে পুরোপুরি আটকে দেবে। দেখা যাবে লগইন পেইজে ঢোকার জন্য ইউজারকে লগইন পেইজ দেখাতে যাবে, আবার সেই লগইন পেইজ দেখানোর জন্য আবার লগইন পেইজ.. এভাবে ইনিফাইনাইট লুপ ঘুরতে থাকবে।

 

এজন্যই  .permitAll() মেথড দিয়ে কিছু রিসোর্স কিংবা রিকোয়েস্টকে সকল ভিজিটরের জন্য উন্মুক্ত করে দেয়া হয়েছে void configure(HttpSecurity http) মেথডে।

এখানে  .and() মেথড XML কনফিগারেশনের একটা element  এর সমাপ্তি হিসেবে কল্পনা করতে পারেন।

.authorizeRequests()  দিয়ে বলা হচ্ছে সব ধরনের রিকোয়েস্ট অথরাইজ করা হবে। প্রথমেই সবাইকে আটকে দিয়ে .antMatchers() দিয়ে  নির্দিষ্ট  ইউআরএল  এ  নির্দিষ্ট রোলের ইউজারকে অ্যাক্সেস দেয়া হয়েছে।

আমরা এখানে আপাতত ইন মেমোরি অথেনটিকেশন ব্যাবহার করেছি  শেষের  মেথডটিতে। পরবর্তী আর্টিকেলে  userDetailsService দিয়ে  (ডেটাবেইজে  ইউজারের টেবিল থেকে তথ্য নিয়ে)  ইউজার অথেনটিকেশন এবং অথরাইজ দেখানোর চেষ্টা করবো।

 


XML কনফিগারেশন


 




XML কনফিগারেশন নিয়ে বেশী কিছু বলবো না। উপরের জাভা কনফিগারেশন  কিভাবে কাজ করে  বুঝতে পারলে  XML কনফিগারেশনের  কোড দেখলে বুঝতে পারবেন আশা করছি।



আর্টিকেলটি প্রথম লেখা হয়েছিল নিজের ব্লগে on MARCH 14, 2017

 

 




সর্বশেষ এডিট : ০৫ ই ডিসেম্বর, ২০১৯ সন্ধ্যা ৬:৫৬
১টি মন্তব্য ০টি উত্তর

আপনার মন্তব্য লিখুন

ছবি সংযুক্ত করতে এখানে ড্রাগ করে আনুন অথবা কম্পিউটারের নির্ধারিত স্থান থেকে সংযুক্ত করুন (সর্বোচ্চ ইমেজ সাইজঃ ১০ মেগাবাইট)
Shore O Shore A Hrosho I Dirgho I Hrosho U Dirgho U Ri E OI O OU Ka Kha Ga Gha Uma Cha Chha Ja Jha Yon To TTho Do Dho MurdhonNo TTo Tho DDo DDho No Po Fo Bo Vo Mo Ontoshto Zo Ro Lo Talobyo Sho Murdhonyo So Dontyo So Ho Zukto Kho Doye Bindu Ro Dhoye Bindu Ro Ontosthyo Yo Khondo Tto Uniswor Bisworgo Chondro Bindu A Kar E Kar O Kar Hrosho I Kar Dirgho I Kar Hrosho U Kar Dirgho U Kar Ou Kar Oi Kar Joiner Ro Fola Zo Fola Ref Ri Kar Hoshonto Doi Bo Dari SpaceBar
এই পোস্টটি শেয়ার করতে চাইলে :
আলোচিত ব্লগ

হার জিত চ্যাপ্টার ৩০

লিখেছেন স্প্যানকড, ১৮ ই এপ্রিল, ২০২৪ দুপুর ১:৩৩



তোমার হুটহাট
চলে আসার অপেক্ষায় থাকি
কি যে এক ছটফটানি
তোমার ফিরে আসা
যেন প্রিয় কারো সনে
কোথাও ঘুরতে যাবার মতো আনন্দ
বারবার ঘড়ি দেখা
বারবার অস্থির হতে হতে
ঘুম ছুটে... ...বাকিটুকু পড়ুন

জীবনাস্ত

লিখেছেন মায়াস্পর্শ, ১৮ ই এপ্রিল, ২০২৪ দুপুর ১:৪৪



ভোরবেলা তুমি নিশ্চুপ হয়ে গেলে একদম,
তোমার বাম হাত আমার গলায় পেঁচিয়ে নেই,
ভাবলাম,তুমি অতিনিদ্রায় আচ্ছন্ন ,
কিন্তু এমন তো কখনো হয়নি
তুমি বরফ জমা নিথর হয়ে আছ ,
আমি... ...বাকিটুকু পড়ুন

যে দেশে সকাল শুরু হয় দুর্ঘটনার খবর দেখে

লিখেছেন এম ডি মুসা, ১৮ ই এপ্রিল, ২০২৪ রাত ৮:১১

প্রতি মিনিটে দুর্ঘটনার খবর দেখে অভ্যস্ত। প্রতিনিয়ত বন্যা জলোচ্ছ্বাস আসে না, প্রতিনিয়ত দুর্ঘটনার খবর আসে। আগে খুব ভোরে হকার এসে বাসায় পত্রিকা দিয়ে যেত। বর্তমানেও প্রচলিত আছে তবে... ...বাকিটুকু পড়ুন

আমাদের দাদার দাদা।

লিখেছেন নাহল তরকারি, ১৮ ই এপ্রিল, ২০২৪ রাত ৮:৫৫

বৃহস্পতিবার, ১৮ এপ্রিল ২০২৪, ৫ বৈশাখ ১৪৩১, ০৮ শাওয়াল ১৪৪৫ হিজরী।

আমার দাদার জন্মসাল আনুমানিক ১৯৫৮ সাল। যদি তার জন্মতারিখ ০১-০১-১৯৫৮ সাল হয় তাহলে আজ তার বয়স... ...বাকিটুকু পড়ুন

জেনে নিন আপনি স্বাভাবিক মানুষ নাকি সাইকো?

লিখেছেন মোহাম্মদ গোফরান, ১৮ ই এপ্রিল, ২০২৪ রাত ১১:১৮


আপনার কি কারো ভালো সহ্য হয়না? আপনার পোস্ট কেউ পড়েনা কিন্তু আরিফ আর হুসাইন এর পোস্ট সবাই পড়ে তাই বলে আরিফ ভাইকে হিংসা হয়?কেউ একজন মানুষকে হাসাতে পারে, মানুষ তাকে... ...বাকিটুকু পড়ুন

×