স্প্রিং সিকিউরিটিঃ আপনার অ্যাপ্লিকেশনের সুরক্ষায়

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

কিন্তু কিভাবে? শুনে মনে হচ্ছে অনেক কিছু করতে হবে। অনেক অনেক কোড লিখতে হবে। কিন্তু আমরা তো আরামপ্রিয় মানুষ  ( হেটার্স রা বলবে আইলসা  )। আমরা তো এত কস্ট করতে চাইনা! আমরা শুধু চাই আমাদের অ্যাপ্লিকেশন টিকে সিকিউর করতে।

টেনশন নিয়েন না। আপনার আমার মত আইলসা পাব্লিকের জন্যই Pivotal এর জোস জোস বড় ভাইয়েরা বানিয়েছে এক অসসাধারন ফ্রেমওয়ার্ক! নাম তার স্প্রিং সিকিউরিটি  আজকের এই পোস্টে আমি হাল্কার উপর ঝাপসা দিয়ে দেখাবো কিভাবে এই টুল টি ব্যবহার করে আমরা আমাদের ওয়েব অ্যাপ্লিকেশন কে  শত্রুর হাত থেকে নিরাপদে রাখতে পারি  ।

শত্রুর মোকাবেলায় স্প্রিং সিকিউরিটি (সম্পূর্ণ এমএস পেইন্ট এ তৈরীকৃত এই দুর্দান্ত শিল্পকর্মটির জন্য কয়টি লাইক?)

কি করবো

এখন আসেন  দেখে নেই আমরা আসলে কি করতে চাচ্ছি। আমাদের ঘর (অ্যাপ্লিকেশন) এ দুই ধরনেরকক্ষ(পেজ/লিঙ্ক) আছে। বসার কক্ষ(পাব্লিক পেজ) যেখানে আমজনতা সবাই ঢুকতে পারবে এবং শোবার কক্ষ(প্রাইভেট পেজ) যেখানে শুধুমাত্র স্পেশাল মানুসজন( যাদের মন ভালো এবং তাদের কাছে ইউজারনেম ও পাসোওার্ড আছে)। যখনি কোন আগন্তুক আমাদের শোবার কক্ষে ঢুকতে চাইবে তখন আমরা তাকে একটি লগিন পেজ এ নিয়ে যাবো। সঠিক নামপরিচয়(ইউজারনেম ও পাসওর্ড) দেওয়ার পর ই শুধু মাত্র আমরা তাকে ঢুকতে দিবো।

কিভাবে করবো

মাত্র ৪ টি সহজ পদক্ষেপে আমরা পুরো কাজটি সেরে ফেলবো। এই টিউটরিয়াল এ আমরা ফ্রেমওয়ার্ক হিসেবে ব্যবহার করবো স্প্রিং বুট।  সুতরাং দেরী না করে চলুন শুরু করা যাক। আপনারা যন্ত্রপাতি নিয়ে তৈরী হয়ে যান(মানে IDE ওপেন করেন আরকি)

(যেহেতু এখন আমরা কোড লিখবো, দুষ্টুমি কথাবার্তা একদম ই বাদ। এখন আমরা সবাই সিরিয়াস  )

ধাপ ১ঃ ডেমো প্রজেক্ট তৈরীকরন

প্রথমে স্প্রিং ইনিশিয়ালাইজার এ গিয়ে আমরা একটি ডেমো স্টার্টার প্রোজেক্ট তৈরী করবো। ডিপেন্ডেন্সি হিসেবে WebSecurity এবং Thymeleaf 

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

ধাপ ২ঃ স্প্রিং সিকিউরিটি কনফিগারেশন

এখন আমাদের দরকার একটি কনফিগারেশন ক্লাস যেটাতে আমরা স্প্রিং সিকিউরিটি কনফিগার করবো।  SecurityConfig.java

package com.rashidul.springsecdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/private").authenticated()
                .and()
                .formLogin()
                .usernameParameter("user")
                .passwordParameter("password")
                .defaultSuccessUrl("/private")
                .loginPage("/login");
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("rashidul").password("rashidul123").roles("USER");
    }
}

SecurityConfig.java ক্লাস টা আমরা এক্সটেন্ড করছি WebSecurityConfigurerAdapter ক্লাস থেকে। configure নামে যে মেথড টা ওভাররাইড করা হচ্ছে সেখানে আমরা আসলে বলে দিচ্ছি কোন কোন URL গুলো অথেন্টিকেশন ছাড়াই এক্সেস করা যাবে এবং কোন গুলোর জন্য ইউজার কে প্রথমে লগিন করতে হবে।  configureGlobal মেথড এ বলা হচ্ছে কোন সোর্স থেকে ইউজার এর দেওয়া ইউজারনেম এবং পাসওয়ার্ড এর কম্বিনেশন ভেরিফাই করা হবে। আমাদের জন্য সহজ হবে তাই আমরা এখানে ইন মেমোরি অথেন্টিকেশন ব্যবহার করছি।

ধাপ ৩ঃ কিছু দরকারি ফাইল 

পুরো ব্যাপার টা ঠিক মত কাজ করছে কিনা সেটা পরীক্ষা করার জন্য আমরা কিছু ফাইল তৈরী করবো।

  1. ResourceController.java
package com.rashidul.springsecdemo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class ResourceController {

    @GetMapping("")
    public String index(){

        return "index";
    }

    @GetMapping("/private")
    public String privatePage(){

        return "private";
    }

    @GetMapping("/login")
    public String loginPage(){

        return "login";
    }
}

2. index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Hello</title>
</head>
<body>
<h1>Hi, this is a public page. everyone can see this</h1>
</body>
</html>

3. private.html

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Hello</title>
</head>
<body>
<h1>Hi, this is a private page. only authenticated users can see this.</h1>
</body>
</html>

4. login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Hello</title>
</head>
<body>
<h1>Bro you need to login first</h1>

<form action="login" method="POST">
    <input type="text" name="user" placeholder="User name" />
    <input type="password" name="password" placeholder="Password" />
    <button type="submit">Submit</button>
</form>
</body>
</html>

টেমপ্লেট ফাইল গুলো src/main/resources/templates এই ডিরেক্টরিতে তৈরী করতে হবে।

ধাপ ৪ঃ কাজ শেষ, এবার আউটপুট দেখার পালা 😀

অ্যাপ্লিকেশন টি রান করে ব্রাউজার এ যদি ওপেন করি তাহলে দেখতে পাবোঃ

tab-0

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

tab-1

এবং ইউজারনেম/পাসওয়ার্ড দিয়ে লগিন করার পরে আমরা “/private” লিঙ্ক অ্যাক্সেস করতে পারবো।

tab-2

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

সোর্সকোডঃ

https://github.com/rashidul-hasan/spring-security-demo