Spring Cloud Security হল Spring Cloud এর একটি অংশ যা মাইক্রোসার্ভিস আর্কিটেকচারের মধ্যে নিরাপত্তা সংক্রান্ত কাজগুলো সহজ ও নিরাপদভাবে পরিচালনা করার জন্য ব্যবহৃত হয়। এটি OAuth2 এবং JWT (JSON Web Token) এর মতো আধুনিক অথেন্টিকেশন এবং অথরাইজেশন প্রোটোকল ব্যবহার করে সার্ভিসগুলির মধ্যে নিরাপদ যোগাযোগ নিশ্চিত করে।
Spring Cloud Security মূলত Spring Security এর উপর ভিত্তি করে তৈরি, কিন্তু এটি মাইক্রোসার্ভিস এবং ক্লাউড আর্কিটেকচারের জন্য বিশেষভাবে কনফিগার করা হয়েছে, যেখানে প্রতিটি সার্ভিসের মধ্যে নিরাপত্তা নিশ্চিত করা এবং সার্ভিসগুলোকে একে অপরের সাথে নিরাপদে যোগাযোগ করতে সাহায্য করা হয়।
Spring Cloud Security এর প্রধান উপাদান:
- OAuth2 এবং JWT Authentication - API গেটওয়ে এবং মাইক্রোসার্ভিসগুলির মধ্যে নিরাপদ অথেন্টিকেশন এবং অথরাইজেশন।
- Single Sign-On (SSO) - একাধিক অ্যাপ্লিকেশনে লগ ইন করার জন্য একমাত্র লগইন ব্যবস্থার মাধ্যমে একক সাইন-অন প্রদান।
- Service-to-Service Authentication - এক সার্ভিস থেকে অন্য সার্ভিসে নিরাপদ যোগাযোগ (mutual TLS, JWT ইত্যাদি)।
- API Gateway Security - API গেটওয়েকে নিরাপদ করার জন্য স্প্রিং ক্লাউড জুয়ুল (Zuul) বা স্প্রিং ক্লাউড গেটওয়ে (Spring Cloud Gateway) এর মাধ্যমে নিরাপত্তা ব্যবস্থা প্রয়োগ করা।
Spring Cloud Security এর মূল বৈশিষ্ট্য:
- OAuth2 Client Support:
- Spring Cloud Security OAuth2 এর ক্লায়েন্ট সাপোর্ট প্রদান করে, যার মাধ্যমে আপনি সহজে OAuth2 প্রোটোকল ব্যবহার করে অথেন্টিকেশন এবং অথরাইজেশন পরিচালনা করতে পারেন।
- JWT (JSON Web Token) Authentication:
- JWT ব্যবহার করে সার্ভিসগুলির মধ্যে নিরাপদ টোকেন-ভিত্তিক অথেন্টিকেশন প্রদান করা হয়। এটি একটি হালকা অথেন্টিকেশন প্রোটোকল যা সিস্টেমের নিরাপত্তা বাড়াতে সাহায্য করে।
- Authorization Server:
- Spring Cloud Security, Spring Security OAuth এর মাধ্যমে একটি Authorization Server তৈরি করতে সহায়ক, যা OAuth2 প্রোটোকল ব্যবহার করে নিরাপত্তা ব্যবস্থা নিশ্চিত করে।
- Service-to-Service Authentication:
- সার্ভিস-টু-সার্ভিস অথেন্টিকেশন এবং অথরাইজেশন ব্যবস্থাপনা যেমন JWT টোকেন ব্যবহার করে, মাইক্রোসার্ভিসগুলো একে অপরকে নিরাপদে কল করতে পারে।
Spring Cloud Security সেটআপ এবং কনফিগারেশন উদাহরণ:
১. OAuth2 Authorization Server (Authorization Server Setup)
আপনি যদি OAuth2 Authorization Server তৈরি করতে চান, তবে আপনাকে Spring Security OAuth লাইব্রেরি ব্যবহার করতে হবে। নিচে একটি উদাহরণ দেওয়া হলো, যেখানে একটি Authorization Server সেটআপ করা হচ্ছে।
ডিপেনডেন্সি যোগ করুন (pom.xml):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-authorization-server</artifactId>
</dependency>
Authorization Server Configuration:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.builders.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.builders.AuthorizationServerEndpointsConfigurer;
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientapp")
.secret("{noop}clientsecret")
.redirectUris("http://localhost:8080/login/oauth2/code/custom")
.authorizedGrantTypes("authorization_code", "refresh_token")
.scopes("read", "write");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints.pathMapping("/oauth/token", "/custom/oauth/token");
}
}
এই কনফিগারেশনটি OAuth2 ক্লায়েন্টের জন্য একটি authorization server তৈরি করবে যা অ্যাপ্লিকেশনের বিভিন্ন অংশে OAuth2 ব্যবস্থাপনা করবে।
২. OAuth2 Resource Server Setup (Resource Server)
একটি Resource Server সেটআপ করতে, আপনি JWT অথবা OAuth2 এর সাহায্যে API গেটওয়ে বা মাইক্রোসার্ভিসের জন্য নিরাপত্তা ব্যবস্থা বাস্তবায়ন করতে পারেন।
ডিপেনডেন্সি যোগ করুন (pom.xml):
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-resource-server</artifactId>
</dependency>
Resource Server Configuration (JWT Authentication):
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.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.oauth2.server.resource.authentication.JwtDecoder;
import org.springframework.security.oauth2.server.resource.authentication.JwtDecoders;
@Configuration
@EnableWebSecurity
public class ResourceServerConfig {
@Bean
public JwtDecoder jwtDecoder() {
return JwtDecoders.fromIssuerLocation("http://auth-server.com");
}
@Bean
public JwtAuthenticationConverter jwtAuthenticationConverter() {
JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
converter.setJwtGrantedAuthoritiesConverter(new JwtGrantedAuthoritiesConverter());
return converter;
}
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2ResourceServer()
.jwt();
}
}
এই কনফিগারেশনটি JWT Authentication সেটআপ করবে এবং নির্দিষ্ট রিসোর্সগুলিতে OAuth2 অথেন্টিকেশন প্রয়োগ করবে।
৩. Spring Cloud Security-এর মাধ্যমে API Gateway নিরাপত্তা
যদি আপনি Spring Cloud Zuul বা Spring Cloud Gateway ব্যবহার করেন, তবে আপনি OAuth2 অথবা JWT টোকেন যাচাই করতে পারবেন, যাতে সব রিকোয়েস্ট প্রথমে অথেন্টিকেশন হয় এবং তারপর সার্ভিসগুলিতে রাউট হয়।
Spring Cloud Zuul Security Configuration (JWT):
zuul:
routes:
userservice:
path: /user/**
serviceId: user-service
ignored-services: '*' # All services are handled by Zuul
security:
jwt:
key: your-jwt-secret-key
এটি Spring Cloud Zuul API গেটওয়ে মাধ্যমে সমস্ত রিকোয়েস্টের উপর JWT Authentication প্রয়োগ করে।
৪. Spring Cloud Security with OAuth2 and JWT for Service-to-Service Authentication
মাইক্রোসার্ভিসগুলির মধ্যে Service-to-Service Authentication করতে OAuth2 বা JWT ব্যবহার করা হয়। সার্ভিসগুলি সাধারণত একে অপরকে কল করার জন্য OAuth2 token অথবা JWT token ব্যবহার করে।
Feign Client for Service-to-Service Authentication:
@FeignClient(name = "order-service", configuration = OAuth2FeignConfig.class)
public interface OrderServiceClient {
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable("id") Long id);
}
এখানে OAuth2FeignConfig ক্লাসটি Feign Client এর মাধ্যমে সার্ভিস-টু-সার্ভিস অথেন্টিকেশন পরিচালনা করবে।
উপসংহার:
Spring Cloud Security একটি শক্তিশালী সুরক্ষা ফ্রেমওয়ার্ক, যা মাইক্রোসার্ভিস আর্কিটেকচারের মধ্যে নিরাপত্তা ব্যবস্থাপনা সহজ ও কার্যকর করে তোলে। এটি OAuth2 এবং JWT ব্যবহার করে অথেন্টিকেশন এবং অথরাইজেশন নিশ্চিত করে, যার মাধ্যমে API Gateway, Resource Server, এবং Service-to-Service নিরাপদ যোগাযোগ সম্পাদন করা সম্ভব হয়। Spring Cloud Security মাইক্রোসার্ভিসগুলির মধ্যে নিরাপত্তা কাঠামো তৈরি করতে সাহায্য করে, যা আধুনিক ক্লাউড অ্যাপ্লিকেশনের জন্য অপরিহার্য।
Spring Cloud এর মাইক্রোসার্ভিস আর্কিটেকচারে সিকিউরিটি একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়। কারণ মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক ছোট ছোট সার্ভিস থাকে যেগুলি একে অপরের সাথে যোগাযোগ করে। এই ধরনের পরিবেশে সিকিউরিটি দুর্বল হলে সার্ভিসগুলির মধ্যে ডেটা লিক, অননুমোদিত অ্যাক্সেস, এবং অন্যান্য নিরাপত্তা ঝুঁকি হতে পারে। Spring Cloud Security মূলত মাইক্রোসার্ভিস আর্কিটেকচার এবং ক্লাউড-নেটিভ অ্যাপ্লিকেশনগুলির জন্য সুরক্ষা ব্যবস্থা প্রদান করে, যেমন অথেনটিকেশন, অথরাইজেশন, ডেটা এনক্রিপশন, ইনটিগ্রিটি এবং প্রাইভেসি।
Spring Cloud তে সিকিউরিটির প্রয়োজনীয়তা:
- মাইক্রোসার্ভিস আর্কিটেকচারে সিকিউরিটি চ্যালেঞ্জ:
- ডিস্ট্রিবিউটেড এনভায়রনমেন্ট: মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক সার্ভিস একে অপরের সাথে যোগাযোগ করে। প্রতিটি সার্ভিসের মধ্যে সঠিক অথেনটিকেশন এবং অথরাইজেশন নিশ্চিত করা প্রয়োজন।
- ডায়নামিক সার্ভিস ডিস্কভারি: সার্ভিসগুলি সহজে যোগ বা মুছে যেতে পারে, যা সিকিউরিটির জন্য একটি চ্যালেঞ্জ সৃষ্টি করে।
- API এক্সপোজার: API গুলি পাবলিকভাবে এক্সপোজ করা হয় এবং সার্ভিস গুলোর মধ্যে যোগাযোগের সময় সিকিউরিটি ঝুঁকি থাকতে পারে।
- স্টেটলেস অথেনটিকেশন: মাইক্রোসার্ভিসগুলির মধ্যে স্টেটলেস অথেনটিকেশন ও অথরাইজেশন ম্যানেজ করা কঠিন।
- বিশ্বস্ত অথেনটিকেশন এবং অথরাইজেশন:
- OAuth2, JWT: মাইক্রোসার্ভিস আর্কিটেকচারে বিশ্বস্ত অথেনটিকেশন এবং অথরাইজেশন ব্যবস্থার প্রয়োজন, যেখানে OAuth2 বা JWT (JSON Web Token) ব্যবহার করা হয়। এটি মাইক্রোসার্ভিস গুলির মধ্যে নিরাপদভাবে অথেনটিকেশন এবং অথরাইজেশন সম্পন্ন করতে সাহায্য করে।
- ডেটা এনক্রিপশন এবং সিকিউরড চ্যানেল:
- সিস্টেমের মধ্যে যোগাযোগের সময় SSL/TLS এনক্রিপশন ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ, যাতে ডেটার গোপনীয়তা নিশ্চিত থাকে এবং তৃতীয় পক্ষ দ্বারা ইন্টারসেপ্ট করা না যায়।
- ভেরিফিকেশন এবং অডিটিং:
- সার্ভিসগুলির মধ্যে কার্যকলাপ ট্র্যাক করা এবং লগ করা, যাতে নিরাপত্তার কোনো ঘটনা (যেমন: অননুমোদিত অ্যাক্সেস) সনাক্ত করা যায় এবং যথাযথ ব্যবস্থা নেওয়া যায়।
- ফলব্যাক ও রেট লিমিটিং:
- সার্ভিস ডাউন বা ফেইল হওয়া এবং রেট লিমিটিং থেকে সুরক্ষা পেতে Hystrix বা Rate Limiting টেকনিক ব্যবহার করা হয়।
Spring Cloud তে সিকিউরিটি প্রদানকারী টুলস এবং টেকনোলজি:
- Spring Security:
- Spring Security একটি শক্তিশালী সিকিউরিটি ফ্রেমওয়ার্ক যা স্প্রিং অ্যাপ্লিকেশনের জন্য অথেনটিকেশন, অথরাইজেশন, এবং অন্যান্য সিকিউরিটি প্রয়োজনীয়তা পূরণ করতে ব্যবহৃত হয়।
- এটি HTTP রিকোয়েস্ট, অ্যাক্সেস কন্ট্রোল, ফিল্টারিং এবং সেশন ম্যানেজমেন্ট ইত্যাদি বিভিন্ন সিকিউরিটি ফিচার সরবরাহ করে।
OAuth2 (Authorization Server):
- OAuth2 হলো একটি সিকিউরিটি প্রোটোকল যা ক্লায়েন্ট-সার্ভিস অথেনটিকেশন নিশ্চিত করতে ব্যবহৃত হয়। Spring Cloud OAuth2 ব্যবহার করে সার্ভিসের মধ্যে অথেনটিকেশন এবং অথরাইজেশন পরিচালনা করা যায়।
- Authorization Server: OAuth2 Authorization Server সেটআপ করতে Spring Security OAuth2 ব্যবহার করা হয়।
spring: security: oauth2: client: registration: google: client-id: YOUR_CLIENT_ID client-secret: YOUR_CLIENT_SECRET scope: - openid - profile - email redirect-uri: "{baseUrl}/login/oauth2/code/google" authorization-grant-type: authorization_code provider: google: authorization-uri: https://accounts.google.com/o/oauth2/auth token-uri: https://oauth2.googleapis.com/token user-info-uri: https://openidconnect.googleapis.com/v1/userinfoJWT (JSON Web Tokens):
- JWT মাইক্রোসার্ভিসের মধ্যে অথেনটিকেশন ও অথরাইজেশন জন্য নিরাপদ পদ্ধতি প্রদান করে। এটি সার্ভিসে একবার লগইন করার পর টোকেন প্রাপ্ত করে এবং সেই টোকেন ব্যবহার করে অন্য সার্ভিসগুলির সাথে যোগাযোগ করা হয়।
- JWT Token Generation Example:
@RestController public class AuthController { @PostMapping("/authenticate") public String authenticate(@RequestBody UserCredentials credentials) { String jwt = jwtTokenProvider.generateToken(credentials); return jwt; } }Spring Cloud Gateway (API Gateway with Security):
- Spring Cloud Gateway হলো একটি API গেটওয়ে যা সার্ভিসগুলির মধ্যে ট্রাফিক রাউটিং, ফিল্টারিং এবং সিকিউরিটি প্রদান করে। এটি API গেটওয়ে হিসেবে নিরাপত্তা নিয়ন্ত্রণ এবং রেট লিমিটিং সহ বিভিন্ন ফিচার সরবরাহ করে।
- Gateway Security Configuration:
spring: cloud: gateway: default-filters: - name: AddRequestHeader args: name: X-Request-Foo value: Bar- Service-to-Service Communication Security:
- মাইক্রোসার্ভিসগুলির মধ্যে নিরাপদ যোগাযোগ নিশ্চিত করতে Mutual TLS (mTLS) বা OAuth2 Client Credentials Flow ব্যবহার করা হয়।
- Spring Cloud Security এবং Spring Security OAuth2 এর মাধ্যমে সার্ভিসগুলো একে অপরের সাথে নিরাপদ যোগাযোগ করতে পারে।
- Hystrix (Circuit Breaker with Security):
- Hystrix হলো একটি Circuit Breaker প্যাটার্ন যা সার্ভিসের মধ্যে সুরক্ষা প্রদান করে এবং সার্ভিস ডাউন হলে ব্যাকআপ পদ্ধতি গ্রহণ করতে সহায়ক।
Spring Cloud Security এর কিছু গুরুত্বপূর্ণ দিক:
- Authentication & Authorization:
- OAuth2, JWT, LDAP, এবং Basic Authentication এর মাধ্যমে মাইক্রোসার্ভিসে অথেনটিকেশন এবং অথরাইজেশন করা হয়। এতে প্রতিটি সার্ভিস তাদের নিরাপত্তা নিশ্চিত করে এবং অবৈধ রিকোয়েস্টকে রিজেক্ট করে।
- API Security:
- API গেটওয়ে এবং মাইক্রোসার্ভিসে SSL/TLS এনক্রিপশন এবং API রেট লিমিটিং ব্যবহৃত হয়, যাতে শুধুমাত্র বৈধ রিকোয়েস্ট প্রক্রিয়া করা হয় এবং সার্ভিসের ওপর অপ্রত্যাশিত চাপ না আসে।
- Auditing and Logging:
- সমস্ত API কল এবং নিরাপত্তা সম্পর্কিত কার্যকলাপ Spring Cloud Sleuth এবং Spring Cloud Bus এর মাধ্যমে মনিটর করা হয়। এটি মাইক্রোসার্ভিসের মধ্যে ট্রেসিং এবং লগিং সম্পাদন করতে সহায়ক।
উপসংহার:
Spring Cloud Security মাইক্রোসার্ভিস আর্কিটেকচারের জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি সার্ভিস গুলির মধ্যে নিরাপত্তা নিশ্চিত করে। এটি অথেনটিকেশন, অথরাইজেশন, ডেটা এনক্রিপশন, সার্ভিস থেকে সার্ভিস কমিউনিকেশন সিকিউরিটি এবং অনেক অন্যান্য নিরাপত্তা ফিচার সরবরাহ করে। এর মাধ্যমে আপনি নিরাপদ এবং স্কেলেবল মাইক্রোসার্ভিস আর্কিটেকচার তৈরি করতে পারেন।
OAuth2 এবং JWT (JSON Web Tokens) ব্যবহার করে Secure Microservices তৈরি করা একটি আধুনিক ও নিরাপদ পদ্ধতি। এই পদ্ধতিটি মাইক্রোসার্ভিস আর্কিটেকচারে সুরক্ষিত অথেন্টিকেশন এবং অথরাইজেশন নিশ্চিত করতে সাহায্য করে।
OAuth2 এবং JWT-এর মাধ্যমে Secure Microservices তৈরি করার ধাপসমূহ
- OAuth2 কি? OAuth2 হল একটি অনুমোদন ফ্রেমওয়ার্ক যা অ্যাপ্লিকেশনগুলিকে ব্যবহারকারীর ডেটাতে অ্যাক্সেস দেওয়ার অনুমতি দেয়, তবে ব্যবহারকারীর পাসওয়ার্ড জানানো ছাড়া। এটি একটি এক্সটার্নাল অথোরাইজেশন সার্ভার ব্যবহার করে যে সার্ভিসটি অ্যাক্সেস করা হচ্ছে।
- JWT কি? JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড (RFC 7519) যা নিরাপদভাবে তথ্য ট্রান্সফার করার জন্য ব্যবহৃত হয়। JWT মূলত একটি টোকেন যা ব্যবহারকারীর অথেন্টিকেশন ইনফরমেশন ধারণ করে এবং এটি স্বাক্ষরিত হয় যাতে ডেটা ভেরিফাই করা যায়।
ধাপ ১: Spring Security ও OAuth2 Configuration
1.1. ডিপেনডেন্সি যোগ করা
প্রথমে spring-boot-starter-oauth2-resource-server এবং spring-boot-starter-security ডিপেনডেন্সি যোগ করতে হবে।
<dependencies>
<!-- OAuth2 Resource Server Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<!-- Spring Security Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- JWT Decoder -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
</dependencies>
1.2. application.properties কনফিগারেশন
OAuth2 অথেন্টিকেশন এবং JWT এর জন্য application.properties অথবা application.yml কনফিগারেশন ফাইলের মাধ্যমে কনফিগার করতে হবে।
# OAuth2 Configuration
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://your-auth-server.com/issuer
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://your-auth-server.com/.well-known/jwks.json
# Optional: Customize JWT validation settings
spring.security.oauth2.resourceserver.jwt.audiences=your-audience
issuer-uri: এটি OAuth2 সার্ভারের ইউআরএল, যেখানে JWT টোকেন তৈরি হয়।jwk-set-uri: এটি JWT টোকেনের পে-লোড ভ্যালিডেট করতে ব্যবহৃত JWK (JSON Web Key) সেটের ইউআরএল।
ধাপ ২: JWT Decoder কনফিগারেশন
JWT Decoder সেটআপ করে JWT টোকেন ভ্যালিডেশন করা হয়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
@Configuration
public class SecurityConfig {
@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder.withJwkSetUri("https://your-auth-server.com/.well-known/jwks.json").build();
}
}
এই কনফিগারেশন JWT টোকেনের সঠিকতা যাচাই করার জন্য NimbusJwtDecoder ব্যবহার করে।
ধাপ ৩: API গেটওয়ে ও Feign Client ব্যবহার করে Secure Microservices
3.1. API গেটওয়ে কনফিগারেশন
আপনি যদি Spring Cloud Gateway বা Zuul API গেটওয়ে ব্যবহার করেন, তবে গেটওয়ে কনফিগারেশনও OAuth2 এবং JWT টোকেন যাচাই করতে হবে।
Spring Cloud Gateway কনফিগারেশন:
# Spring Cloud Gateway OAuth2 Configuration
spring.security.oauth2.client.registration.my-client.client-id=your-client-id
spring.security.oauth2.client.registration.my-client.client-secret=your-client-secret
spring.security.oauth2.client.registration.my-client.scope=read,write
spring.security.oauth2.client.provider.my-client.token-uri=https://your-auth-server.com/oauth/token
3.2. Feign Client Authentication
Feign ক্লায়েন্টে OAuth2 টোকেন ব্যবহার করার জন্য, আপনাকে HTTP হেডারে টোকেন যোগ করতে হবে।
@FeignClient(name = "user-service", configuration = OAuth2FeignConfig.class)
public interface UserServiceClient {
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") Long id);
}
@Configuration
public class OAuth2FeignConfig {
@Bean
public RequestInterceptor oauth2RequestInterceptor() {
return new OAuth2RequestInterceptor();
}
}
ধাপ ৪: Resource Server কনফিগারেশন
অথবা আপনি একটি Resource Server তৈরি করতে পারেন যা JWT টোকেন ভ্যালিডেশন করবে এবং সেটি Spring Security দিয়ে সুরক্ষিত হবে।
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;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public endpoints
.anyRequest().authenticated() // Secure all other endpoints
.and()
.oauth2ResourceServer().jwt(); // Enable JWT authentication
}
}
এখানে, `/public/** এন্ডপয়েন্টটি পাবলিক এবং বাকি সব রিকোয়েস্ট সুরক্ষিত (authenticated) করা হয়েছে।
ধাপ ৫: OAuth2 Authorization Server তৈরি করা
যদি আপনি একটি কাস্টম Authorization Server চান, তবে আপনাকে Spring Security OAuth2 Authorization Server কনফিগারেশন করতে হবে।
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.oauth2.authorization.server.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.authorization.server.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.and()
.authorizeRequests()
.anyRequest().authenticated();
}
@Bean
public ClientDetailsServiceConfigurer clientDetailsServiceConfigurer() {
return new ClientDetailsServiceConfigurer()
.withClient("your-client-id")
.secret("your-client-secret")
.authorizedGrantTypes(AuthorizationGrantType.CLIENT_CREDENTIALS)
.scopes("read", "write");
}
}
ধাপ ৬: Secure Microservices Example
6.1. Authentication Controller (For getting JWT Token)
@RestController
@RequestMapping("/auth")
public class AuthController {
private final AuthenticationManager authenticationManager;
public AuthController(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@PostMapping("/token")
public String getToken(@RequestBody AuthenticationRequest authRequest) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword()));
return jwtTokenProvider.generateToken(authentication);
}
}
6.2. Secure API Controller
@RestController
@RequestMapping("/api")
public class SecureController {
@GetMapping("/users")
public String getUsers() {
return "List of users from secure service";
}
}
এখানে /auth/token এ রিকোয়েস্ট পাঠিয়ে JWT টোকেন পাওয়া যাবে এবং সেই টোকেন দিয়ে /api/users এর মতো সুরক্ষিত এন্ডপয়েন্ট অ্যাক্সেস করা যাবে।
উপসংহার:
- OAuth2 এবং JWT এর মাধ্যমে আপনার মাইক্রোসার্ভিসগুলি সুরক্ষিত করতে পারবেন।
- Spring Security ব্যবহার করে OAuth2 এবং JWT টোকেনের সাহায্যে অথেন্টিকেশন এবং অথরাইজেশন কনফিগার করা যায়।
- Feign Client এবং Spring Cloud Gateway-এ OAuth2 এবং JWT সমর্থন রয়েছে, যা মাইক্রোসার্ভিসগুলির মধ্যে নিরাপদ যোগাযোগ নিশ্চিত করে।
- Resource Server কনফিগার করে JWT ভ্যালিডেশন চালু করা যায়।
এই পদ্ধতিটি মাইক্রোসার্ভিস আর্কিটেকচারের নিরাপত্তা নিশ্চিত করতে অত্যন্ত গুরুত্বপূর্ণ, যেখানে বিভিন্ন সার্ভিস একে অপরের সাথে নিরাপদভাবে যোগাযোগ করতে পারে।
Spring Cloud Gateway হল একটি API গেটওয়ে যা রিভার্স প্রোক্সি হিসেবে কাজ করে এবং মাইক্রোসার্ভিস আর্কিটেকচারে HTTP রিকোয়েস্ট রাউটিং, লোড ব্যালেন্সিং এবং ফিল্টারিং সমাধান প্রদান করে। এটি Spring Security এর সাথে সহজে ইন্টিগ্রেট করা যায় যাতে আপনি API রিকোয়েস্টগুলোর সুরক্ষা নিশ্চিত করতে পারেন। Spring Cloud Gateway-এর সাথে Security Integration করার মাধ্যমে আপনি Authentication, Authorization, এবং অন্যান্য সিকিউরিটি ফিচার যেমন OAuth2, JWT, Basic Authentication ইত্যাদি প্রয়োগ করতে পারেন।
এখানে আমরা Spring Cloud Gateway এবং Spring Security এর ইন্টিগ্রেশন এবং কিভাবে Authentication এবং Authorization এর জন্য OAuth2, Basic Authentication এবং JWT কনফিগার করা যায় তা নিয়ে বিস্তারিত আলোচনা করব।
1. Spring Cloud Gateway এবং Spring Security Integration
Maven Dependencies (pom.xml):
প্রথমে আপনাকে Spring Cloud Gateway এবং Spring Security এর জন্য প্রয়োজনীয় ডিপেনডেন্সি যুক্ত করতে হবে।
<dependencies>
<!-- Spring Cloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Spring Security for Authentication & Authorization -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- OAuth2 Login (Optional) -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<!-- JWT Authentication (Optional) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
</dependencies>
2. Spring Cloud Gateway Configuration for Security
Basic Authentication Example:
Spring Cloud Gateway-এ Basic Authentication কনফিগার করতে হলে Spring Security এর সাহায্যে HTTP Basic Authentication চালু করতে হবে।
application.yml:
spring:
cloud:
gateway:
routes:
- id: user_route
uri: http://localhost:8081
predicates:
- Path=/users/**
filters:
- AddRequestHeader=X-Request-Foo, Bar
security:
user:
name: user
password: password
- এখানে Basic Authentication কনফিগার করা হয়েছে, যেখানে
userএবংpasswordএর মাধ্যমে Authentication করা হবে।
Security Configuration (SecurityConfig.java):
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("/users/**").authenticated() // Protect /users/** endpoints
.anyRequest().permitAll()
.and()
.httpBasic(); // Enable Basic Authentication
}
}
- এখানে HTTP Basic Authentication সক্রিয় করা হয়েছে, এবং
/users/**এন্ডপয়েন্টে Authentication বাধ্যতামূলক করা হয়েছে।
3. Spring Cloud Gateway and OAuth2 Security Integration
OAuth2 Authentication Example:
Spring Cloud Gateway-এর মাধ্যমে OAuth2 Authorization Code Flow অথবা Client Credentials Flow ব্যবহার করে নিরাপত্তা সুনিশ্চিত করা সম্ভব।
application.yml (OAuth2 Login):
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET
scope: openid, profile, email
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
client-name: Google
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/auth
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
- এখানে OAuth2 কনফিগারেশনটি করা হয়েছে, যেখানে Google OAuth2 প্রোভাইডার ব্যবহার করা হচ্ছে। ক্লায়েন্ট-আইডি এবং ক্লায়েন্ট-সিক্রেট পরিবর্তন করতে হবে আপনার OAuth2 প্রোভাইডারের তথ্য অনুসারে।
Security Configuration (SecurityConfig.java):
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableOAuth2Client
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/users/**").authenticated() // Protect /users/** endpoints
.anyRequest().permitAll()
.and()
.oauth2Login(); // Enable OAuth2 Login
return http.build();
}
}
- এখানে OAuth2Login সক্রিয় করা হয়েছে, যা OAuth2 প্রোভাইডার (যেমন, Google) থেকে লগইন করার জন্য ব্যবহৃত হবে।
4. JWT Authentication Example with Spring Cloud Gateway
JWT Authentication Setup:
Spring Cloud Gateway-এ JWT authentication কনফিগার করতে হলে, প্রথমে JWT Token তৈরি এবং এটি যাচাই করতে হবে। এই টোকেনটি সাধারণত Authorization হেডারে পাঠানো হয়।
application.yml (JWT Security):
spring:
cloud:
gateway:
routes:
- id: user_route
uri: http://localhost:8081
predicates:
- Path=/users/**
filters:
- name: JwtAuthenticationFilter
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:8080/oauth2/jwks # JWT issuer URI
JWT Authentication Filter:
একটি কাস্টম JWT Authentication Filter তৈরি করতে হবে যা Authorization হেডারে JWT টোকেন যাচাই করবে।
import org.springframework.security.web.server.authentication.AuthenticationWebFilter;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
@Component
public class JwtAuthenticationFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// Extract JWT from Authorization header and validate
String token = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
if (token == null || !token.startsWith("Bearer ")) {
return chain.filter(exchange);
}
token = token.substring(7); // Remove "Bearer " prefix
// JWT Validation logic here...
return chain.filter(exchange);
}
}
5. Enabling Global Filters for Security
Spring Cloud Gateway এ global filters ব্যবহার করে আপনি প্রতিটি রিকোয়েস্টে সিকিউরিটি চেক করতে পারেন। এটি Authentication বা Authorization এর জন্য বিশেষভাবে সহায়ক হতে পারে।
Global Filters Example:
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class SecurityGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, org.springframework.cloud.gateway.filter.GatewayFilterChain chain) {
String authToken = exchange.getRequest().getHeaders().getFirst("Authorization");
if (authToken == null || !authToken.startsWith("Bearer ")) {
return Mono.error(new RuntimeException("Unauthorized Access"));
}
// Token validation logic here
return chain.filter(exchange);
}
}
- এখানে Global Filter ব্যবহার করা হয়েছে যা প্রতিটি রিকোয়েস্টের জন্য Authorization হেডার চেক করে।
Conclusion
Spring Cloud Gateway এর সাথে Spring Security ইন্টিগ্রেট করে আপনি আপনার মাইক্রোসার্ভিস আর্কিটেকচারে শক্তিশালী Authentication এবং Authorization সিস্টেম তৈরি করতে পারেন। এখানে কভার করা হয়েছে Basic Authentication, OAuth2 Login, এবং JWT Authentication। এসব পদ্ধতি প্রয়োগের মাধ্যমে আপনি মাইক্রোসার্ভিসের মধ্যে সিকিউর কনফিগারেশন এবং সিস্টেমের নিরাপত্তা নিশ্চিত করতে পারবেন।
যদি কোন নির্দিষ্ট বিষয় বা কনফিগারেশন সম্পর্কে আরও সাহায্য প্রয়োজন হয়, জানাবেন! 😊
Spring Cloud Security একটি স্প্রিং ক্লাউড লাইব্রেরি যা মাইক্রোসার্ভিস আর্কিটেকচারে সিকিউরিটি এবং অথেন্টিকেশন/অথোরাইজেশন সলিউশন প্রদান করে। এটি একটি বিস্তৃত সিকিউরিটি কনফিগারেশন প্রদান করে, যেমন OAuth2, JWT, সিঙ্গল সাইন-অন (SSO), এবং ক্লাউড-নেটিভ সিকিউরিটি ফিচারগুলির জন্য সমাধান। Spring Cloud Security ব্যবহৃত হলে, এটি একটি সেন্ট্রাল অথেন্টিকেশন সার্ভিসে সংযুক্ত হয় এবং মাইক্রোসার্ভিসগুলির মধ্যে নিরাপত্তা ব্যবস্থাপনা সহজ করে তোলে।
Spring Cloud Security ব্যবহার করার জন্য উদাহরণ
এখানে আমরা OAuth2 এবং JWT এর সাহায্যে একটি সিম্পল Spring Cloud Security ইনটিগ্রেশন উদাহরণ দেখব, যেখানে একটি API Gateway (Zuul) এর মাধ্যমে সেন্ট্রাল অথেন্টিকেশন সার্ভিসে (যেমন Keycloak) লোগইন প্রক্রিয়া পরিচালিত হবে।
ধাপ ১: Spring Cloud Security ডিপেনডেন্সি যোগ করা
আপনার Spring Cloud প্রজেক্টে OAuth2 বা JWT অথেন্টিকেশন সিস্টেম সক্রিয় করতে আপনাকে Spring Security এবং Spring Cloud Security লাইব্রেরি যুক্ত করতে হবে।
pom.xml (Spring Cloud Security):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
ধাপ ২: OAuth2 Configuration Setup
এই উদাহরণে আমরা OAuth2 প্রটোকল ব্যবহার করব, যেখানে একটি Authorization Server (যেমন Keycloak বা Authorization Server) ব্যবহার করে ক্লায়েন্ট অ্যাপ্লিকেশনে অথেন্টিকেশন সম্পন্ন হবে।
application.yml (API Gateway - Zuul)
API Gateway (Zuul) এ OAuth2 কনফিগারেশন:
spring:
security:
oauth2:
client:
registration:
keycloak:
client-id: your-client-id
client-secret: your-client-secret
scope: openid, profile, email
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider: keycloak
provider:
keycloak:
authorization-uri: https://keycloak-server/auth/realms/{realm}/protocol/openid-connect/auth
token-uri: https://keycloak-server/auth/realms/{realm}/protocol/openid-connect/token
user-info-uri: https://keycloak-server/auth/realms/{realm}/protocol/openid-connect/userinfo
এখানে Keycloak কে Authorization Server হিসেবে ব্যবহার করা হয়েছে, যেখানে client-id, client-secret, এবং redirect-uri দেয়া হয়েছে। এই কনফিগারেশনের মাধ্যমে Zuul API Gateway OAuth2 ক্লায়েন্ট হিসেবে কাজ করবে এবং Keycloak থেকে টোকেন গ্রহণ করবে।
ধাপ ৩: Feign Client এর মাধ্যমে SSO Integration
স্প্রিং ক্লাউড সিকিউরিটির সাহায্যে OAuth2 Authentication এর জন্য Feign Client ব্যবহার করা যেতে পারে।
Feign Client Interface (OAuth2 Client):
package com.example.feignclient.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "user-service")
public interface UserServiceClient {
@GetMapping("/api/users")
String getUsers();
}
OAuth2 Client API Gateway থেকে User Service এ সুরক্ষিত কল করবে।
Feign Client Configuration (Authorization Token পাঠানো):
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OAuth2ClientService {
private final RestTemplate restTemplate;
private final OAuth2AuthenticationToken authenticationToken;
public OAuth2ClientService(RestTemplate restTemplate, OAuth2AuthenticationToken authenticationToken) {
this.restTemplate = restTemplate;
this.authenticationToken = authenticationToken;
}
public String fetchUsersFromService() {
String accessToken = authenticationToken.getCredentials().toString();
return restTemplate.getForObject("http://user-service/api/users?access_token=" + accessToken, String.class);
}
}
এখানে OAuth2AuthenticationToken ব্যবহার করা হচ্ছে অ্যাক্সেস টোকেন পেতে, যা ক্লায়েন্ট সার্ভিসে পাঠানো হবে।
ধাপ ৪: Security Configuration
এখন আমরা Spring Security কনফিগার করব যাতে API Gateway নিরাপদ থাকে এবং কেবলমাত্র অথেন্টিকেটেড ইউজাররা এক্সেস করতে পারে।
SecurityConfig.java (API Gateway - Zuul):
package com.example.apigateway.security;
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 {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.oauth2Login() // OAuth2 Login config
.and()
.authorizeRequests()
.antMatchers("/api/**").authenticated() // Protect all endpoints
.anyRequest().permitAll();
}
}
এখানে /api/** সব রিকোয়েস্টের জন্য authentication করা হচ্ছে। অর্থাৎ, কোনো ইউজার যিনি অথেন্টিকেটেড না, তিনি এই এন্ডপয়েন্টে অ্যাক্সেস করতে পারবেন না।
ধাপ ৫: Keycloak অথবা Authorization Server Setup
- Keycloak বা অন্য কোনো OAuth2 Authorization Server সেটআপ করুন।
- Client এবং Server কনফিগারেশন অনুযায়ী Client ID, Client Secret, Authorization URL, Token URL, এবং UserInfo URL প্রদান করুন।
ধাপ ৬: Application Run and Authentication
- Zuul API Gateway চলু করুন।
- ব্রাউজারে গিয়ে
http://localhost:8080এ কল করুন। - সিস্টেম আপনাকে Keycloak অথবা অন্য Authorization Server-এ লগইন করতে বলবে।
- লগইন সম্পন্ন হলে, অ্যাক্সেস টোকেন পেয়ে যাবেন এবং সিস্টেমে লগইন হয়ে যাবেন।
Spring Cloud Security-র সুবিধা:
- Centralized Authentication: OAuth2 / JWT Authentication দিয়ে ক্লাউড-নেটিভ অ্যাপ্লিকেশনের সুরক্ষা সহজ হয়।
- Single Sign-On (SSO): মাইক্রোসার্ভিসের মধ্যে সিঙ্গেল সাইন-অন সুবিধা দেওয়া হয়, যেখানে একবার লগইন করার পর সব সার্ভিস এক্সেস করা যায়।
- Token Management: OAuth2 এর মাধ্যমে JWT tokens ব্যবহার করা হয়, যা নিরাপত্তা এবং পারফরম্যান্স বৃদ্ধি করে।
- Flexible and Scalable: স্প্রিং ক্লাউড সিকিউরিটি খুবই স্কেলেবল এবং মাইক্রোসার্ভিস আর্কিটেকচারে সহজে ইন্টিগ্রেট করা যায়।
সারাংশ:
- Spring Cloud Security মাইক্রোসার্ভিস আর্কিটেকচারে সুরক্ষা এবং অথেন্টিকেশন সহজ করে।
- OAuth2, JWT এবং SSO এর মাধ্যমে মাইক্রোসার্ভিসগুলির মধ্যে সুরক্ষিত এবং স্কেলেবল সিস্টেম তৈরি করা সম্ভব।
- Zuul Gateway এর মাধ্যমে API গেটওয়ে হিসেবে একাধিক সার্ভিসের সুরক্ষা নিয়ন্ত্রণ করা যায়।
Read more