जावा में प्राधिकरण और प्रमाणीकरण: स्प्रिंग सिक्योरिटी और JWT
जावा में वेब एप्लिकेशन विकसित करते समय संसाधनों तक सुरक्षित पहुँच का आयोजन एक प्रमुख कार्य है। इस लेख में हम दो मूलभूत अवधारणाओं पर चर्चा करेंगे: प्रमाणीकरण (उपयोगकर्ता की पहचान सत्यापित करना) और प्राधिकरण (पहुँच अधिकारों की जाँच करना)। हम लोकप्रिय फ्रेमवर्क स्प्रिंग सिक्योरिटी और तकनीक JSON Web Tokens (JWT) के साथ व्यावहारिक उदाहरण देखेंगे।
1. मूल अवधारणाएँ
कोड पर जाने से पहले, शब्दों को स्पष्ट रूप से अलग करना महत्वपूर्ण है:
- प्रमाणीकरण (Authentication) — यह जाँचने की प्रक्रिया है कि उपयोगकर्ता कौन है। आमतौर पर लॉगिन और पासवर्ड, बायोमेट्रिक्स या टोकन के माध्यम से किया जाता है।
- प्राधिकरण (Authorization) — यह निर्धारित करने की प्रक्रिया है कि उपयोगकर्ता को क्या करने की अनुमति है। उदाहरण के लिए, API के विशिष्ट एंडपॉइंट या एप्लिकेशन के फ़ंक्शन तक पहुँच।
आधुनिक जावा एप्लिकेशन में, इन तंत्रों को लागू करने के लिए अक्सर स्प्रिंग सिक्योरिटी + JWT के संयोजन का उपयोग किया जाता है। JWT उपयोगकर्ता के बारे में जानकारी को एक कॉम्पैक्ट टोकन में संग्रहीत करने की अनुमति देता है, जिसे क्लाइंट और सर्वर के बीच आसानी से स्थानांतरित किया जा सकता है।
2. JWT के साथ स्प्रिंग सिक्योरिटी की स्थापना
pom.xml (Maven) में आवश्यक निर्भरताएँ जोड़ें:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.3</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency>3. JWT के साथ काम करने के लिए सेवा बनाना
एक JwtService क्लास बनाएँ जो टोकन जनरेशन और सत्यापन के लिए जिम्मेदार होगी:
import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Service;
import javax.crypto.SecretKey;import java.util.Date;import java.util.HashMap;import java.util.Map;
@Servicepublic class JwtService {
private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final long expirationMs = 86400000; // 24 घंटे
public String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); return Jwts.builder() .setClaims(claims) .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + expirationMs)) .signWith(secretKey) .compact(); }
public String extractUsername(String token) { return extractAllClaims(token).getSubject(); }
private Claims extractAllClaims(String token) { return Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) .getBody(); }
public boolean isTokenValid(String token, String username) { final String extractedUsername = extractUsername(token); return (extractedUsername.equals(username) && !isTokenExpired(token)); }
private boolean isTokenExpired(String token) { return extractAllClaims(token).getExpiration().befo