Java Technologies Spring Boot এবং Security গাইড ও নোট

326

Spring Boot Security একটি শক্তিশালী এবং নমনীয় নিরাপত্তা ফ্রেমওয়ার্ক যা Spring অ্যাপ্লিকেশনকে নিরাপদ করতে সহায়তা করে। এটি বিভিন্ন নিরাপত্তা ব্যবস্থা যেমন Authentication, Authorization, Encryption, CSRF Protection, Session Management, ইত্যাদি সহজভাবে কার্যকর করতে সাহায্য করে। Spring Boot Security এর মাধ্যমে আপনি ওয়েব অ্যাপ্লিকেশন এবং RESTful সেবাগুলির জন্য নিরাপত্তা ব্যবস্থা ইনস্টল করতে পারেন।

Spring Security Spring Framework এর একটি গুরুত্বপূর্ণ অংশ যা Java অ্যাপ্লিকেশনের সিকিউরিটি প্রদান করে এবং বিভিন্ন ধরনের আক্রমণ থেকে সুরক্ষা নিশ্চিত করে।


Spring Boot Security এর মূল বৈশিষ্ট্য

Spring Boot Security আপনাকে নিম্নলিখিত ফিচারসমূহ প্রদান করে:

  • Authentication (অথেনটিকেশন): ব্যবহারকারীর পরিচয় নিশ্চিত করা।
  • Authorization (অথোরাইজেশন): ব্যবহারকারীকে নির্দিষ্ট রিসোর্স অ্যাক্সেস করতে অনুমতি দেয়া।
  • CSRF Protection (ক্রস-সাইট রিকোয়েস্ট ফর্জারি): সাইটের নিরাপত্তা রক্ষা করা।
  • Session Management (সেশন ম্যানেজমেন্ট): লগইন সেশনগুলি পরিচালনা করা।
  • Password Encoding (পাসওয়ার্ড এনকোডিং): নিরাপদ পাসওয়ার্ড স্টোরেজ।
  • Custom Security Filters (কাস্টম সিকিউরিটি ফিল্টার): কাস্টম নিরাপত্তা ফিল্টার এবং এক্সেপশন হ্যান্ডলিং।

Spring Boot Security ইনস্টলেশন

Spring Boot Security ব্যবহারের জন্য প্রথমে আপনাকে প্রকল্পে Spring Security ডিপেনডেন্সি যোগ করতে হবে। Spring Initializr ব্যবহার করে আপনি সহজেই এই ডিপেনডেন্সি যুক্ত করতে পারেন অথবা ম্যানুয়ালি pom.xml ফাইলে নিচের মতো ডিপেনডেন্সি যোগ করতে হবে।

pom.xml ফাইলে Spring Security ডিপেনডেন্সি:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

এটি Spring Security এর সমস্ত প্রয়োজনীয় লাইব্রেরি আপনার প্রকল্পে যোগ করবে।


Spring Boot Security এর মূল কনফিগারেশন

Spring Boot Security এর সাথে কাজ করার জন্য সাধারণত একটি কনফিগারেশন ক্লাস তৈরি করা হয় যা সিকিউরিটি সেটিংস এবং পলিসি নির্ধারণ করে।

1. Basic Authentication কনফিগারেশন

Spring Boot Security এর মাধ্যমে Basic Authentication এর কনফিগারেশন করা যায়। নিচে একটি উদাহরণ দেখানো হলো:

package com.example.demo;

import org.springframework.context.annotation.Configuration;
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
            .authorizeRequests()
            .antMatchers("/login").permitAll() // Login পেজ সকলের জন্য উন্মুক্ত
            .anyRequest().authenticated() // অন্যান্য রিকোয়েস্টের জন্য অথেনটিকেশন প্রয়োজন
            .and()
            .formLogin() // Form-based login enabled
            .permitAll(); // Login পেজে সব ইউজারের অ্যাক্সেস থাকবে
    }
}

এখানে, /login পেজ সব ব্যবহারকারীর জন্য উন্মুক্ত এবং অন্য যেকোনো পেজের জন্য অথেনটিকেশন প্রয়োজন।

2. ইন-মেমরি ইউজার স্টোরেজ কনফিগারেশন

Spring Security তে ইউজার তৈরি এবং পাসওয়ার্ড যাচাই করার জন্য InMemoryUserDetailsManager ব্যবহার করা যেতে পারে। নিচে একটি উদাহরণ দেয়া হলো:

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.InMemoryUserDetailsManager;

@Configuration
public class SecurityConfig {

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                               .username("user")
                               .password("password")
                               .roles("USER")
                               .build();
        
        return new InMemoryUserDetailsManager(user);
    }
}

এখানে, InMemoryUserDetailsManager ব্যবহার করে ইন-মেমরি ইউজার তৈরি করা হয়েছে, যার ইউজারনেম "user" এবং পাসওয়ার্ড "password"।

3. কাস্টম পাসওয়ার্ড এনকোডার

Spring Security তে পাসওয়ার্ড এনকোডিং অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ব্যবহারকারীদের পাসওয়ার্ড নিরাপদে সংরক্ষণ করতে সহায়তা করে। নিচে একটি উদাহরণ দেখানো হলো কিভাবে কাস্টম পাসওয়ার্ড এনকোডার ব্যবহার করা হয়।

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

এখানে, BCryptPasswordEncoder পাসওয়ার্ড এনকোডিংয়ের জন্য ব্যবহৃত হয়েছে।


Spring Boot Security এর ব্যবহার

Spring Boot Security ব্যবহার করার পর, আপনার অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে নিরাপদ হয়ে যাবে। আপনি যদি আরও কাস্টম নিরাপত্তা পলিসি প্রয়োগ করতে চান, তবে আপনাকে বিভিন্ন কনফিগারেশন এবং ফিল্টার তৈরি করতে হবে। উদাহরণস্বরূপ:

  • Custom Authentication Filters: নিজস্ব অথেনটিকেশন ফিল্টার তৈরি করা।
  • Method Level Security: মেথড-ভিত্তিক অথোরাইজেশন (যেমন @PreAuthorize, @Secured)।

সারাংশ

Spring Boot Security একটি শক্তিশালী সিকিউরিটি ফ্রেমওয়ার্ক যা আপনার অ্যাপ্লিকেশনকে সুরক্ষিত রাখতে সাহায্য করে। এটি সহজেই Authentication এবং Authorization পরিচালনা করতে সক্ষম, এবং আপনি কাস্টম পাসওয়ার্ড এনকোডিং, CSRF প্রটেকশন, সেশন ম্যানেজমেন্ট, এবং আরও অনেক সিকিউরিটি ফিচার ব্যবহার করতে পারেন। Spring Boot Security আপনার ওয়েব অ্যাপ্লিকেশন এবং RESTful সার্ভিসগুলির নিরাপত্তা নিশ্চিত করতে সহজ এবং নমনীয় কনফিগারেশন প্রদান করে।

Content added By

Spring Boot Security এর মৌলিক ধারণা

298

Spring Boot Security একটি শক্তিশালী নিরাপত্তা ফ্রেমওয়ার্ক যা Spring অ্যাপ্লিকেশনগুলিতে নিরাপত্তা সংক্রান্ত বিভিন্ন ফিচার যেমন অথেনটিকেশন (authentication), অথরাইজেশন (authorization), সেশন ম্যানেজমেন্ট, এবং ক্রস-সাইট স্ক্রিপ্টিং (XSS) এবং ক্রস-সাইট রিকোয়েস্ট ফোরজি (CSRF) প্রতিরোধের জন্য ব্যবহৃত হয়। Spring Security Spring Framework-এর একটি গুরুত্বপূর্ণ অংশ এবং এটি ব্যবহার করে Spring Boot অ্যাপ্লিকেশনগুলিকে সুরক্ষিত করা যায়।


Spring Boot Security এর মূল বিষয়

Spring Boot Security-তে কয়েকটি প্রধান ধারণা আছে যা নিরাপত্তা সংক্রান্ত বিভিন্ন কার্যকলাপ নিয়ন্ত্রণ করে। এই ধারণাগুলি হল:

1. Authentication (অথেনটিকেশন)

অথেনটিকেশন হলো প্রক্রিয়া যার মাধ্যমে নিশ্চিত করা হয় যে, ব্যবহারকারী আসল এবং সঠিক। Spring Security-এর মাধ্যমে আপনি ব্যবহারকারীর পরিচিতি যাচাই করতে পারেন। সাধারণত এটি ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে হয়, কিন্তু আপনি অন্যান্য পদ্ধতিও ব্যবহার করতে পারেন যেমন OAuth, LDAP, বা সিম্পল টোকেন বেসড অথেনটিকেশন।

  • উদাহরণ: যদি একটি ব্যবহারকারী লগ ইন করতে চান, তবে তার ইউজারনেম এবং পাসওয়ার্ড দিয়ে অথেনটিকেশন পরীক্ষা করা হয়।
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user")
            .password(passwordEncoder().encode("password"))
            .roles("USER");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

এখানে, withUser("user") ইউজারনেম সেট করে এবং password(passwordEncoder().encode("password")) পাসওয়ার্ড এনক্রিপ্ট করে অথেনটিকেশন সেটআপ করা হচ্ছে।

2. Authorization (অথরাইজেশন)

অথরাইজেশন হলো প্রক্রিয়া যার মাধ্যমে কোন ব্যবহারকারী নির্দিষ্ট রিসোর্স বা অ্যাপ্লিকেশন ফিচারের অ্যাক্সেস পাবেন, তা নির্ধারণ করা হয়। Spring Security-তে আপনি ব্যবহারকারীদের বিভিন্ন রোল এবং অথরাইজেশন পলিসি অ্যাসাইন করতে পারেন। এটি নিশ্চিত করে যে শুধুমাত্র নির্দিষ্ট রোলের ব্যবহারকারী নির্দিষ্ট রিসোর্সে প্রবেশ করতে পারে।

  • উদাহরণ: যদি আপনি একটি অ্যাডমিন প্যানেল তৈরি করেন, তবে শুধুমাত্র "ADMIN" রোলের ব্যবহারকারীরা সেখানে প্রবেশ করতে পারবেন।
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasRole("USER")
            .anyRequest().authenticated()
            .and()
            .formLogin();
    }
}

এখানে, /admin/** রিসোর্স শুধুমাত্র "ADMIN" রোলের ব্যবহারকারীদের জন্য উন্মুক্ত, এবং /user/** রিসোর্স "USER" রোলের জন্য।

3. CSRF Protection (ক্রস-সাইট রিকোয়েস্ট ফোরজি)

Spring Security ডিফল্টভাবে CSRF (Cross-Site Request Forgery) আক্রমণ প্রতিরোধ করে। CSRF আক্রমণ তখন ঘটে যখন একটি হ্যাকার একটি বিশ্বাসযোগ্য ওয়েবসাইটে অনিচ্ছাকৃতভাবে ব্যবহারকারীর অ্যাকাউন্ট থেকে একটি অনুরোধ পাঠায়।

  • উদাহরণ: আপনি যদি কোনও ফর্ম জমা দিতে চান তবে Spring Security CSRF টোকেনটি প্রমাণ করবে এবং এর মাধ্যমে নিশ্চিত করবে যে এটি বৈধ অনুরোধ।
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable() // CSRF Protection নিষ্ক্রিয় করা (যদি প্রয়োজন না হয়)
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin();
}

নোট: CSRF প্রতিরোধ সক্ষম রাখা নিরাপত্তার জন্য গুরুত্বপূর্ণ, তবে কোনো কারণে এটি নিষ্ক্রিয় করতে হলে উপরের কোড ব্যবহার করা যেতে পারে।

4. CORS (Cross-Origin Resource Sharing)

CORS একটি নিরাপত্তা বৈশিষ্ট্য যা এক ডোমেইন থেকে অন্য ডোমেইনে রিসোর্স শেয়ার করার জন্য ব্রাউজারের মাধ্যমে নিয়ন্ত্রণ রাখে। Spring Security এর মাধ্যমে CORS কনফিগার করা যায়, যাতে শুধুমাত্র নির্দিষ্ট ডোমেইন থেকে অ্যাপ্লিকেশনে প্রবেশ করা যায়।

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and()
        .authorizeRequests()
        .anyRequest().authenticated();
}

এখানে cors() মেথডটি CORS কনফিগার করে এবং এটি নিরাপত্তার জন্য একটি খুব গুরুত্বপূর্ণ ভূমিকা পালন করে।

5. Password Encoding (পাসওয়ার্ড এনক্রিপশন)

Spring Security ডিফল্টভাবে পাসওয়ার্ড এনক্রিপশনের জন্য BCryptPasswordEncoder ব্যবহার করে। এটি পাসওয়ার্ডের নিরাপত্তা নিশ্চিত করে, কারণ পাসওয়ার্ড কখনোই প্লেইন টেক্সট আকারে সংরক্ষিত হয় না। Spring Security ব্যবহার করে পাসওয়ার্ড এনক্রিপশন নিশ্চিত করা হয়।

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

এখানে, BCryptPasswordEncoder পাসওয়ার্ড এনক্রিপশন করার জন্য ব্যবহার হচ্ছে।


Spring Boot Security এর ফিচারসমূহ

  • Form-based Authentication: Spring Security ব্যবহার করে সহজেই ফর্ম বেসড অথেনটিকেশন বাস্তবায়ন করা যায়।
  • Basic Authentication: HTTP বেসিক অথেনটিকেশনও সহজেই করা যায়।
  • LDAP Authentication: LDAP ডিরেক্টরি সার্ভারের মাধ্যমে অথেনটিকেশন করা সম্ভব।
  • OAuth 2.0 & JWT: OAuth 2.0 এবং JWT (JSON Web Token) ইন্টিগ্রেশন ব্যবহার করে আধুনিক অথেনটিকেশন ব্যবস্থা তৈরি করা যায়।
  • Session Management: Spring Security সেশন ম্যানেজমেন্ট ফিচার সরবরাহ করে যাতে সেশন চুরি এবং সেশন ফিক্সেশন আক্রমণ রোধ করা যায়।

সারাংশ

Spring Boot Security একটি শক্তিশালী সিকিউরিটি ফ্রেমওয়ার্ক যা Spring অ্যাপ্লিকেশনগুলিতে অথেনটিকেশন, অথরাইজেশন, CSRF, CORS, এবং পাসওয়ার্ড এনক্রিপশনসহ একাধিক নিরাপত্তা ফিচার প্রদান করে। এটি Spring অ্যাপ্লিকেশনগুলির নিরাপত্তা নিশ্চিত করতে সহায়তা করে এবং ব্যবহারকারীদের একাধিক রোল ও পারমিশন দিয়ে বিভিন্ন রিসোর্স অ্যাক্সেস নিয়ন্ত্রণ করতে সাহায্য করে। Spring Security-র মাধ্যমে আপনি অত্যন্ত শক্তিশালী এবং নিরাপদ ওয়েব অ্যাপ্লিকেশন তৈরি করতে পারবেন।

Content added By

Spring Security দিয়ে Authentication এবং Authorization

311

Spring Security একটি শক্তিশালী এবং কাস্টমাইজেবল ফ্রেমওয়ার্ক যা অ্যাপ্লিকেশনে নিরাপত্তা প্রদান করতে ব্যবহৃত হয়। এটি মূলত Authentication (ব্যবহারকারীর পরিচয় যাচাই) এবং Authorization (ব্যবহারকারীর অ্যাক্সেস অনুমতি) নিশ্চিত করার জন্য ব্যবহৃত হয়। Spring Security ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে ব্যবহারকারীর লগইন এবং নিরাপত্তা নীতি সহজভাবে ইমপ্লিমেন্ট করতে পারেন।

এখানে Spring Security দিয়ে Authentication এবং Authorization সেটআপ করার পদ্ধতি আলোচনা করা হবে।


Authentication এবং Authorization এর মধ্যে পার্থক্য

  • Authentication (অথেনটিকেশন): এটি হল একটি প্রক্রিয়া যার মাধ্যমে আমরা যাচাই করি যে ব্যবহারকারী যে পরিচয় দাবি করছে, সেটি সঠিক কি না। সাধারণত, এটি ব্যবহারকারীর ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে করা হয়।
  • Authorization (অথোরাইজেশন): এটি হল একটি প্রক্রিয়া যার মাধ্যমে নির্ধারণ করা হয় যে ব্যবহারকারী একটি নির্দিষ্ট রিসোর্স বা অ্যাপ্লিকেশন ফিচারে অ্যাক্সেস পাবে কিনা।

Spring Security দিয়ে Authentication

Spring Security দিয়ে Authentication প্রক্রিয়াটি সহজে কনফিগার করা যায়। Spring Security দিয়ে ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে লগইন সিস্টেম তৈরি করা হয়। এজন্য নিম্নলিখিত স্টেপগুলি অনুসরণ করা যেতে পারে:

১. Spring Security Dependency যুক্ত করা

প্রথমে আপনার pom.xml ফাইলে Spring Security এর ডিপেনডেন্সি যুক্ত করতে হবে:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

২. WebSecurityConfigurerAdapter কনফিগারেশন

Spring Security কনফিগার করার জন্য একটি কাস্টম কনফিগারেশন ক্লাস তৈরি করতে হবে যা WebSecurityConfigurerAdapter এক্সটেন্ড করবে। উদাহরণস্বরূপ, ইউজারনেম এবং পাসওয়ার্ড দিয়ে Authentication কনফিগার করতে নিচের কোডটি ব্যবহার করা যেতে পারে:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/login", "/register").permitAll()  // login এবং register পেজ কে পাবলিক রাখুন
            .anyRequest().authenticated()  // অন্যান্য পেজের জন্য authentication প্রয়োজন
            .and()
            .formLogin()
            .loginPage("/login")  // কাস্টম লগইন পেজ
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()  // ইন-মেমরি Authentication
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

কনফিগারেশন ব্যাখ্যা:

  • authorizeRequests(): এটি HTTP রিকোয়েস্ট গুলিকে নির্দিষ্ট কনফিগারেশন অনুযায়ী অনুমতি দেয়। উদাহরণস্বরূপ, /login এবং /register পেজগুলোকে সকলের জন্য খোলা রাখা হয়েছে, তবে অন্য পেজের জন্য Authentication প্রয়োজন।
  • formLogin(): এটি একটি কাস্টম লগইন পেজ সেট করে দেয় এবং লগইন প্রক্রিয়ায় নিরাপত্তা কনফিগার করে।
  • inMemoryAuthentication(): এখানে ইন-মেমরি Authentication কনফিগার করা হয়েছে। এটি ডেমো অ্যাপ্লিকেশনে সিম্পল ইউজারনেম এবং পাসওয়ার্ড দিয়ে Authentication দেয়।
  • passwordEncoder(): পাসওয়ার্ড এনকোডিংয়ের জন্য BCryptPasswordEncoder ব্যবহার করা হয়েছে।

৩. Custom Login Page তৈরি

আপনি যদি কাস্টম লগইন পেজ ব্যবহার করতে চান, তবে একটি সিম্পল HTML পেজ তৈরি করতে হবে, যেমন:

<!-- login.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h2>Login Page</h2>
    <form action="/login" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required /><br><br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required /><br><br>
        <input type="submit" value="Login" />
    </form>
</body>
</html>

Spring Security দিয়ে Authorization

Authorization কনফিগারেশন Spring Security-তে বিভিন্ন রোল এবং পারমিশন অনুযায়ী করা যায়। অর্থাৎ, আমরা নির্দিষ্ট ব্যবহারকারীদের বিভিন্ন অ্যাক্সেস অনুমতি দিতে পারি।

১. রোল এবং পারমিশন কনফিগারেশন

Spring Security এর মাধ্যমে বিভিন্ন রোল তৈরি করা হয় এবং রোলের ভিত্তিতে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। নিচে রোল অনুযায়ী Authorization কনফিগার করার উদাহরণ দেওয়া হলো:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")  // ADMIN রোল ছাড়া অন্যরা অ্যাক্সেস পাবে না
            .antMatchers("/user/**").hasRole("USER")  // USER রোল ছাড়া অন্যরা অ্যাক্সেস পাবে না
            .anyRequest().authenticated()  // অন্যান্য সব রিকোয়েস্টের জন্য Authentication প্রয়োজন
            .and()
            .formLogin()
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }
}

২. Role-based Authentication

এটি দেখায় যে কিভাবে ভিন্ন রোলের উপর ভিত্তি করে ব্যবহারকারীদের ভিন্ন ভিন্ন অ্যাক্সেস দেওয়া হয়। উদাহরণস্বরূপ:

  • /admin/** পেজ শুধুমাত্র ADMIN রোলধারী ব্যবহারকারীরা অ্যাক্সেস করতে পারবে।
  • /user/** পেজ শুধুমাত্র USER রোলধারী ব্যবহারকারীরা অ্যাক্সেস করতে পারবে।

৩. Custom Authentication Provider

Spring Security দিয়ে আপনি কাস্টম Authentication Provider ব্যবহার করতে পারেন যেখানে আপনি নিজের Authentication লজিক ইমপ্লিমেন্ট করতে পারবেন।

@Service
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = (String) authentication.getCredentials();

        // কাস্টম Authentication Logic
        if ("user".equals(username) && "password".equals(password)) {
            return new UsernamePasswordAuthenticationToken(username, password, new ArrayList<>());
        } else {
            throw new BadCredentialsException("Invalid username or password");
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

সারাংশ

Spring Security দিয়ে Authentication এবং Authorization প্রক্রিয়া সহজভাবে কনফিগার করা যায়। Authentication প্রক্রিয়ায় ব্যবহারকারীর পরিচয় যাচাই করা হয় এবং Authorization এর মাধ্যমে বিভিন্ন রোলের উপর ভিত্তি করে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। Spring Security এর WebSecurityConfigurerAdapter ব্যবহার করে আপনি কাস্টম Authentication এবং Authorization কনফিগারেশন করতে পারেন, যার ফলে আপনার অ্যাপ্লিকেশন নিরাপদ এবং নিরাপত্তা নীতি অনুযায়ী পরিচালিত হয়।

Content added By

JWT (JSON Web Token) Authentication এর Integration

329

JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড যা নিরাপদভাবে তথ্য আদান-প্রদান করার জন্য ব্যবহৃত হয়। এটি একটি ক্রিপ্টোগ্রাফিক সাইনড টোকেন যা ব্যবহারকারীর প্রমাণীকরণ (authentication) এবং অনুমোদন (authorization) পরিচালনায় গুরুত্বপূর্ণ ভূমিকা পালন করে। স্প্রিং বুট (Spring Boot) এর সাথে JWT ব্যবহার করে নিরাপদ REST API তৈরি করা একটি জনপ্রিয় পদ্ধতি। এখানে আমরা দেখব কীভাবে স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করা যায়।


JWT Authentication এর মূল ধারণা

JWT টোকেন দুটি প্রধান অংশে বিভক্ত:

  1. Header: এই অংশটি টোকেনের ধরন এবং সিগনেচার অ্যালগরিদম নির্ধারণ করে।
  2. Payload: এই অংশটি ব্যবহারকারীর তথ্য ধারণ করে, যেমন ইউজার আইডি, রোল ইত্যাদি।
  3. Signature: টোকেনটির নিরাপত্তা নিশ্চিত করতে এই অংশে একটি সিগনেচার থাকে যা header এবং payload এর সাথে একটি সিক্রেট কী ব্যবহার করে তৈরি হয়।

JWT টোকেন সাধারণত দুটি উদ্দেশ্যে ব্যবহৃত হয়:

  • Authentication: ইউজার লগইন করার পরে টোকেনটি ব্যবহার করে API এক্সেস প্রদান করা।
  • Authorization: ইউজারের রোল এবং অনুমতি যাচাই করা।

স্প্রিং বুটে JWT Authentication Integration

স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করতে, কিছু গুরুত্বপূর্ণ স্টেপ অনুসরণ করতে হয়। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো, যেখানে স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করা হবে এবং JWT Authentication ব্যবহার করা হবে।


১. প্রজেক্ট ডিপেনডেন্সি যোগ করা

pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

এখানে spring-boot-starter-security স্প্রিং সিকিউরিটির জন্য এবং jjwt JWT টোকেন ব্যবহারের জন্য ব্যবহার করা হয়েছে।


২. JWT Utility ক্লাস তৈরি করা

এখন আমরা একটি JWTUtility ক্লাস তৈরি করব, যা JWT টোকেন তৈরি এবং যাচাই করবে।

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JWTUtil {

    private String secretKey = "secret"; // সিক্রেট কী যা JWT সাইন করার জন্য ব্যবহৃত হবে

    // JWT টোকেন তৈরি করার পদ্ধতি
    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1 ঘণ্টার জন্য টোকেন
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }

    // JWT টোকেন থেকে ব্যবহারকারীর নাম (username) বের করার পদ্ধতি
    public String extractUsername(String token) {
        return extractClaims(token).getSubject();
    }

    // JWT টোকেন থেকে Claims (টোকেনের Payload) বের করার পদ্ধতি
    private Claims extractClaims(String token) {
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody();
    }

    // টোকেনের বৈধতা যাচাই করার পদ্ধতি
    public Boolean validateToken(String token, String username) {
        String extractedUsername = extractUsername(token);
        return (extractedUsername.equals(username) && !isTokenExpired(token));
    }

    // টোকেনটি মেয়াদ উত্তীর্ণ হয়েছে কিনা তা যাচাই করার পদ্ধতি
    private Boolean isTokenExpired(String token) {
        return extractClaims(token).getExpiration().before(new Date());
    }
}

এই ক্লাসটি generateToken মেথড ব্যবহারকারীর জন্য একটি JWT টোকেন তৈরি করবে এবং validateToken মেথড এটি যাচাই করবে।


৩. JWT Filter ক্লাস তৈরি করা

স্প্রিং সিকিউরিটি কনফিগারেশন ফিল্টার ব্যবহার করে JWT টোকেন যাচাই করা হয়। এখানে একটি JWTFilter ক্লাস তৈরি করা হলো, যা API কলের সময় JWT টোকেনকে পরীক্ষা করবে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class JWTFilter extends OncePerRequestFilter {

    @Autowired
    private JWTUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            String username = jwtUtil.extractUsername(token);

            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                if (jwtUtil.validateToken(token, username)) {
                    // Authenticated, set user context here if needed
                }
            }
        }

        filterChain.doFilter(request, response);
    }
}

৪. স্প্রিং সিকিউরিটি কনফিগারেশন

স্প্রিং সিকিউরিটি কনফিগারেশন ব্যবহার করে JWT ফিল্টার সেটআপ করা হবে। SecurityConfig ক্লাসে সিকিউরিটি কনফিগারেশন করা হবে।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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 {

    @Autowired
    private JWTFilter jwtFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/login", "/register").permitAll()  // Allow public access to these endpoints
                .anyRequest().authenticated()  // All other requests need authentication
                .and()
                .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); // Add JWT filter
    }
}

৫. লগইন API তৈরি করা

লগইন করার জন্য একটি API তৈরি করা হবে, যা সঠিক ইউজারনেম এবং পাসওয়ার্ড হলে JWT টোকেন রিটার্ন করবে।

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/auth")
public class AuthController {

    @Autowired
    private JWTUtil jwtUtil;

    @PostMapping("/login")
    public String login(@RequestBody UserCredentials credentials) {
        // Validate user credentials (e.g. check in database)
        if (credentials.getUsername().equals("user") && credentials.getPassword().equals("password")) {
            return jwtUtil.generateToken(credentials.getUsername());
        } else {
            throw new RuntimeException("Invalid credentials");
        }
    }
}

সারাংশ

স্প্রিং বুটে JWT Authentication ইন্টিগ্রেট করার জন্য, আমাদের প্রথমে JWT Utility তৈরি করতে হয় যা টোকেন তৈরি ও যাচাই করবে। এরপর JWT Filter ব্যবহার করে টোকেন যাচাই করতে হবে এবং Security Configuration এর মাধ্যমে সিকিউরিটি সেটআপ করতে হবে। এই প্রক্রিয়ার মাধ্যমে, আমরা একটি নিরাপদ এবং স্কেলেবল JWT Authentication সিস্টেম তৈরি করতে পারি যা স্প্রিং বুট REST API এর সাথে ইন্টিগ্রেট করা যাবে।

Content added By

উদাহরণ সহ Security Management

223

Spring Boot অ্যাপ্লিকেশনে সিকিউরিটি ম্যানেজমেন্ট অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি একটি ওয়েব অ্যাপ্লিকেশন তৈরি করেন, যেখানে ব্যবহারকারীদের অনুমতি এবং নিরাপত্তা বজায় রাখা প্রয়োজন। Spring Boot এ সিকিউরিটি ব্যবস্থাপনা Spring Security ব্যবহার করে সম্পন্ন করা হয়। Spring Security একটি শক্তিশালী ফ্রেমওয়ার্ক, যা অ্যাপ্লিকেশনের নিরাপত্তা যেমন অথেন্টিকেশন (Authentication), অথরাইজেশন (Authorization), এবং অন্যান্য নিরাপত্তা ফিচার ম্যানেজ করে।

এখানে Spring Boot এর সাথে Spring Security ব্যবহার করে একটি সিকিউরিটি ম্যানেজমেন্ট সিস্টেম তৈরি করার উদাহরণ দেয়া হলো।


1. প্রয়োজনীয় ডিপেনডেন্সি ইনস্টল করা

Spring Boot অ্যাপ্লিকেশনে সিকিউরিটি ব্যবস্থাপনা সেটআপ করার জন্য, প্রথমে spring-boot-starter-security ডিপেনডেন্সি pom.xml ফাইলে যোগ করতে হবে।

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
</dependencies>

এখানে, spring-boot-starter-security ডিপেনডেন্সি Spring Security এর মূল কার্যকারিতা প্রদান করে।


2. Spring Security কনফিগারেশন

Spring Security কনফিগারেশন সাধারণত WebSecurityConfigurerAdapter ক্লাস এক্সটেন্ড করে করা হয়। এই ক্লাসে আপনি নিরাপত্তার বিভিন্ন সেটিংস কনফিগার করতে পারবেন যেমন ইউজার অথেন্টিকেশন, অথরাইজেশন, এবং কাস্টম ইউজার ডিটেইলস সার্ভিস।

2.1 কাস্টম সিকিউরিটি কনফিগারেশন

package com.example.helloworld.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // HTTP Security কনফিগারেশন
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN") // শুধুমাত্র ADMIN রোলের জন্য
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN") // USER বা ADMIN রোলের জন্য
            .antMatchers("/").permitAll() // হোম পেজ সকলের জন্য উন্মুক্ত
            .and()
            .formLogin() // ফর্ম লগিন পেজ সক্রিয় করা
            .permitAll() // লগিন পেজ সকলের জন্য উন্মুক্ত
            .and()
            .logout() // লগ আউট ফিচার সক্রিয় করা
            .permitAll();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    @Bean
    public UserDetailsService userDetailsService() {
        var user1 = User.withUsername("user")
                        .password(passwordEncoder().encode("password"))
                        .roles("USER")
                        .build();

        var admin = User.withUsername("admin")
                        .password(passwordEncoder().encode("admin"))
                        .roles("ADMIN")
                        .build();

        return new InMemoryUserDetailsManager(user1, admin);
    }
}

এখানে:

  • http.authorizeRequests(): আমরা URL পাথের জন্য নিরাপত্তা বিধি তৈরি করেছি। যেমন, /admin/** পাথ শুধুমাত্র ADMIN রোলের জন্য অ্যাক্সেসযোগ্য।
  • passwordEncoder(): এটি একটি PasswordEncoder Bean যা ব্যবহারকারীর পাসওয়ার্ড এনক্রিপ্ট করবে। এখানে BCryptPasswordEncoder ব্যবহার করা হয়েছে।
  • userDetailsService(): ইন-মেমরি ইউজার ডিটেইলস ম্যানেজমেন্টের জন্য InMemoryUserDetailsManager ব্যবহার করা হয়েছে। এখানে দুটি ইউজার, user এবং admin তৈরি করা হয়েছে।

3. লগইন পেজ তৈরি করা

Spring Security ডিফল্টভাবে একটি লগইন ফর্ম তৈরি করে, তবে আপনি কাস্টম লগইন পেজও তৈরি করতে পারেন। এখানে, আমরা একটি সাধারণ কাস্টম লগইন পেজ তৈরি করব।

3.1 লগইন পেজ তৈরি করা

src/main/resources/templates/login.html ফাইলে একটি সিম্পল HTML ফর্ম তৈরি করা হয়েছে:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form action="/login" method="post">
        <label for="username">Username:</label><br>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">Password:</label><br>
        <input type="password" id="password" name="password" required><br><br>
        <button type="submit">Login</button>
    </form>
</body>
</html>

এটি একটি সাধারণ লগইন ফর্ম যা ব্যবহারকারীর নাম এবং পাসওয়ার্ড নেয় এবং /login পাথের দিকে POST রিকোয়েস্ট পাঠায়।


4. Controller তৈরি করা

এখন, আমাদের একটি Controller তৈরি করতে হবে যা বিভিন্ন রোলের জন্য অ্যাক্সেস প্রদান করবে এবং লগইন সফল হলে রেসপন্স দেবে।

4.1 Controller উদাহরণ

package com.example.helloworld.controller;

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

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "Welcome to the home page!";
    }

    @GetMapping("/user")
    public String userPage() {
        return "Welcome User!";
    }

    @GetMapping("/admin")
    public String adminPage() {
        return "Welcome Admin!";
    }
}

এখানে, /user পাথ ইউজারদের জন্য, /admin পাথ অ্যাডমিনদের জন্য এবং / পাথ সকলের জন্য উন্মুক্ত রয়েছে।


5. Spring Security কনফিগারেশন কার্যকর করা

Spring Security কনফিগারেশন স্বয়ংক্রিয়ভাবে Spring Boot অ্যাপ্লিকেশনে কার্যকর হয়ে যাবে। এই কনফিগারেশন অনুযায়ী, /admin/** পাথ শুধুমাত্র ADMIN রোলের ইউজারের জন্য অ্যাক্সেসযোগ্য, /user/** পাথ USER এবং ADMIN রোল উভয়ের জন্য অ্যাক্সেসযোগ্য, এবং / পাথ সকলের জন্য উন্মুক্ত থাকবে।


সারাংশ

Spring Boot এবং Spring Security ব্যবহার করে সিকিউরিটি ম্যানেজমেন্ট সহজভাবে সম্পন্ন করা যায়। @Configuration এবং WebSecurityConfigurerAdapter ক্লাসের মাধ্যমে কাস্টম সিকিউরিটি কনফিগারেশন তৈরি করা হয়। BCryptPasswordEncoder ব্যবহার করে পাসওয়ার্ড এনক্রিপ্ট করা হয় এবং InMemoryUserDetailsManager ব্যবহার করে ইউজার ডিটেইলস ম্যানেজ করা হয়। লগইন পেজ কাস্টমাইজ করা যায় এবং রোল-ভিত্তিক অথরাইজেশন প্রয়োগ করা যায়। Spring Security নিরাপত্তা বজায় রাখতে সহায়ক একটি শক্তিশালী টুল।

Content added By
Promotion

Are you sure to start over?

Loading...