التفويض والمصادقة في Java: المفاهيم الأساسية والأدوات
المصادقة والتفويض هما ركيزتان أساسيتان لأمان أي تطبيق ويب. في بيئة Java، توجد العديد من المكتبات والأطر الناضجة لهذه المهام. في هذه المقالة، سنشرح بالتفصيل الأدوات الرئيسية وميزاتها ونقدم أمثلة عملية على الكود.
1. المفاهيم الأساسية
قبل الانتقال إلى الأدوات، من المهم التمييز بوضوح بين المصطلحات:
- المصادقة — التحقق من هوية المستخدم (من أنت؟). تتم عادةً عبر اسم المستخدم/كلمة المرور، الرموز المميزة أو القياسات الحيوية.
- التفويض — التحقق من صلاحيات الوصول (ما المسموح لك به؟). يحدد ما إذا كان يمكن للمستخدم تنفيذ إجراءات معينة.
2. Spring Security — المعيار الفعلي
Spring Security هو الإطار الأكثر شيوعًا لضمان الأمان في تطبيقات Java. يوفر حلاً شاملاً لكل من المصادقة والتفويض.
2.1. الإعداد الأساسي للمصادقة
لإضافة Spring Security، أضف التبعية في pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>التهيئة الدنيا مع المصادقة في الذاكرة:
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.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.provisioning.InMemoryUserDetailsManager;import org.springframework.security.web.SecurityFilterChain;
@Configurationpublic class SecurityConfig {
@Bean public InMemoryUserDetailsManager userDetailsManager() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); }
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authz -> authz .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() ) .formLogin(login -> login.defaultSuccessUrl("/home")) .httpBasic(); return http.build(); }}3. JWT (JSON Web Tokens) للمصادقة عديمة الحالة
يسمح JWT بتنفيذ المصادقة دون حفظ الحالة على الخادم. يحتوي الرمز المميز على جميع المعلومات الضرورية عن المستخدم ويتم توقيعه بمفتاح سري.
3.1. إنشاء JWT باستخدام مكتبة jjwt
أضف التبعية:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.5</version></dependency>مثال على إنشاء والتحقق من الرمز المميز:
import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import javax.crypto.SecretKey;import java.util.Date;
public class JwtUtil {
private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); private static final long EXPIRATION_TIME = 3600000; // 1 ساعة
public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTi