Misol sifatida X.509, Siteminder va Java EE konteyneri tomonidan autentifikatsiyani keltirish mumkin, unda ilova ishlaydi. Oldindan autentifikatsiya qilishda Spring Security quyidagi narsalarni bajarishi kerak:
-
So'rovni amalga oshirayotgan foydalanuvchini aniqlash.
-
Foydalanuvchi uchun vakolatlarni olish.
Detallar tashqi autentifikatsiya mexanizmiga bog‘liq bo‘ladi. X.509 holatida foydalanuvchi sertifikati ma'lumotiga yoki Siteminder holatida HTTP so‘rov sarlavhasiga qarab aniqlanishi mumkin. Agar konteyner autentifikatsiyasiga tayanilsa, foydalanuvchi kiruvchi HTTP so‘rov orqali getUserPrincipal() metodini chaqirish orqali aniqlanadi. Ba'zi hollarda tashqi mexanizm foydalanuvchining roli/vakolatlari haqida ma'lumot berishi mumkin, lekin boshqa hollarda UserDetailsService kabi alohida manbadan vakolatlarni olish kerak bo‘ladi.
Oldindan autentifikatsiya qilish freyvmorki klasslari
Aksariyat oldindan autentifikatsiya qilish mexanizmlari bir xil andoza bo‘yicha ishlaganligi sababli, Spring Security oldindan autentifikatsiya qilish uchun ichki freyvmorkni ta'minlovchi klasslar to‘plamini o‘z ichiga oladi. Bu dublikatlashni yo‘q qiladi va yangi realizatsiyalarni tuzilgan shaklda qo‘shishga imkon beradi, hammasini noldan yozmasdan. Agar X.509 asosidagi autentifikatsiya kabi narsalarni ishlatmoqchi bo‘lsangiz, bu klasslar haqida hech narsa bilishingiz shart emas, chunki u allaqachon foydalanishning oddiyroq va boshlash uchun osonroq bo'lgan nom maydoni konfiguratsiyasini ta'minlaydi. Agar siz aniq bean konfiguratsiyasidan foydalanmoqchi bo‘lsangiz yoki o‘zingizning realizatsiyangizni yozishni rejalashtirsangiz, uzatilgan realizatsiyalar qanday ishlashini tushunish foydali bo'ladi. Klasslarni org.springframework.security.web.authentication.preauth da topishingiz mumkin. Bu yerda biz faqat umumiy tavsif beramiz, shuning uchun bu talab qilinsa Javadoc va manbalarga murojaat qilishingiz kerak.
AbstractPreAuthenticatedProcessingFilter
Ushbu klass xavfsizlik konteksti hozirgi tarkibini tekshiradi va agar u bo‘sh bo‘lsa, foydalanuvchi ma’lumotlarini HTTP so‘rovdan olishga harakat qiladi va uni AuthenticationManager ga uzatadi. Subklasslar ushbu ma’lumotlarni olish uchun quyidagi metodlarni qayta aniqlaydilar:
protected abstract Object getPreAuthenticatedPrincipal(HttpServletRequest request);
protected abstract Object getPreAuthenticatedCredentials(HttpServletRequest request);
protected abstract fun getPreAuthenticatedPrincipal(request: HttpServletRequest): Any?
protected abstract fun getPreAuthenticatedCredentials(request: HttpServletRequest): Any?
Ular chaqirilgandan so'ng, filtr qaytarilgan ma'lumotlarni o'z ichiga olgan PreAuthenticatedAuthenticationToken yaratadi va uni autentifikatsiyaga yuboradi. Bu yerda “autentifikatsiya” deganda foydalanuvchi vakolatlarini yuklash uchun mumkin bo‘lgan boshqa ishlov berish nazarda tutiladi, lekin Spring Security-ning standart autentifikatsiya arxitekturasiga rioya qilinganda.
Spring Security ning boshqa autentifikatsiya filtrlari kabi, oldindan autentifikatsiya qilish filtri authenticationDetailsSource xususiyatiga ega, bu sukut bo‘yicha details xususiyatida qo‘shimcha ma’lumotlarni, masalan, sessiya identifikatori va manba IP-manzilini saqlash uchun WebAuthenticationDetails ob'ektini yaratadi. Agar foydalanuvchi roli haqidagi ma'lumotlarni oldindan autentifikatsiya mexanizm orqali olish mumkin bo'lsa, ushbu ma'lumotlar GrantedAuthoritiesContainer interfeysini amalga oshiradigan tafsilotlar hisobga olingan holda ushbu xususiyatda ham saqlanadi. Bu autentifikatsiya provayderiga tashqaridan foydalanuvchiga ajratilgan vakolatlarni o‘qishga imkon beradi. Keyingi maqolada biz aniq misolni ko'rib chiqamiz.
J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource
Agar filtr ushbu klassning nusxasi bo‘lgan authenticationDetailsSource yordamida sozlangan bo‘lsa, vakolatlar ma’lum bir oldindan belgilangan to‘plamdan “ko‘rsatilgan rol” uchun isUserInRole(String role) metodini chaqirish orqali olinadi. Klass ularni sozlangan MappableAttributesRetriever dan oladi. Imkoniyatli realizatsiya variantlari kontekstda ro‘yxatni qattiq kodlash va web.xml faylida <security-role> bo‘limidagi rol ma’lumotlarini o‘qishni o‘z ichiga oladi. Oldindan autentifikatsiya uchun dastur misolida oxirgi yondashuv ishlatiladi.
Rollar (yoki atributlar) Spring Security dan GrantedAuthority ob'ektlariga sozlangan Attributes2GrantedAuthoritiesMapper orqali xaritalanadigan qo'shimcha bosqich mavjud. Odatiy bo'lib nomlarga oddiygina ROLE_ prefiksi qo'shiladi, ammo bu ishning mantiqiy qismiga to'liq nazoratni beradi.
PreAuthenticatedAuthenticationProvider
Oldindan autentifikatsiyadan o‘tgan provayderga foydalanuvchi uchun UserDetails ob'ektini yuklash qoladi. U buni AuthenticationUserDetailsService xizmatiga vakolat berish orqali amalga oshiradi. So'nggi standart UserDetailsService ga o'xshaydi, lekin faqat foydalanuvchi nomini emas, balki Authentication ob'ektini qabul qiladi:
public interface AuthenticationUserDetailsService {
UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException;
}
Ushbu interfeys boshqa maqsadlarda ham ishlatilishi mumkin, lekin oldindan autentifikatsiya qilishda, u Authentication ob'ektiga o'rab qo‘yilgan vakolatlarga kirish imkonini beradi, bu avvalgi bo‘limda kuzatilgan edi. Buni PreAuthenticatedGrantedAuthoritiesUserDetailsService klassi amalga oshiradi. Shu bilan bir qatorda, u UserDetailsByNameServiceWrapper realizatsiyasi orqali vakolatlarni standart UserDetailsService ga topshirishi mumkin.
Http403ForbiddenEntryPoint
AuthenticationEntryPoint autentifikatsiya qilinmagan foydalanuvchi uchun autentifikatsiya jarayonini ishga tushirish uchun javob beradi (agar u himoyalangan resursga kirishga harakat qilsa), lekin oldindan autentifikatsiya qilish holatida ishlatilmaydi. Siz ExceptionTranslationFilter ni ushbu klass nusxasidan foydalanib faqat oldindan autentifikatsiyani boshqa autentifikatsiya mexanizmlari bilan birgalikda ishlatmasangiz sozlashingiz mumkin. Agar foydalanuvchi AbstractPreAuthenticatedProcessingFilter tomonidan rad etilsa, bu chaqiriladi, bu null-autentifikatsiyaga olib keladi. Chaqirilganda har doim 403-forbidden javob kodi qaytariladi.
Aniq realizatsiyalar
X.509 asosidagi autentifikatsiya alohida bobda tavsiflangan. Bu yerda biz oldindan autentifikatsiya ssenariylarini qo'llab-quvvatlash uchun sinflarni ko‘rib chiqamiz.
So‘rov sarlavhasi bo‘yicha autentifikatsiya (Siteminder)
Tashqi autentifikatsiya tizimi muayyan sarlavhalar o'rnatish orqali ilovaga ma'lumotni yetkazishi mumkin. Bunday tizimning yorqin misoli Siteminder bo'lib, u foydalanuvchi nomini SM_USER sarlavhamasida jo‘natadi. Ushbu mexanizm foydalanuvchi nomini sarlavhadan chiqarib olish uchun shunchaki ishlaydigan RequestHeaderAuthenticationFilter klas tomonidan qo‘llab-quvvatlanadi. Default holda, sarlavha nomi sifatida SM_USER ishlatiladi. Qo‘shimcha ma’lumot olish uchun javadocga qarang.
Shuni yodda tutingki, bunday tizimdan foydalanishda freyvmork umuman hech qanday autentifikatsiya tekshiruvi amalga oshirmaydi, shuning uchun tashqi tizimni to'g'ri sozlanganligiga va ilovaga har qanday murojaatni himoya qilishni ta’minlash juda muhimdir. Agar yomon niyatli odam manba so'rovidagi sarlavhalarni soxtalashtira oladigan bo'lsa va buni aniqlashning iloji bo'lmasa, u o'z xohishiga ko‘ra har qanday foydalanuvchi nomini tanlay oladi.
Siteminder-ni qo‘llash misol konfiguratsiyasi
Ushbu filtrdan foydalanishda oddiy konfiguratsiya quyidagi ko'rinishda bo'ladi:
<security:http>
<!-- Qo‘shimcha http konfiguratsiyasi qo‘shimcha qilinmagan -->
<security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</security:http>
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
</property>
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>
Bu yerda biz xavfsizlik nom maydonidan foydalanayotganimizni taxmin qildik. Shuningdek, foydalanuvchi rollarini yuklash uchun konfiguratsiyaga UserDetailsService (nomi "userDetailsService") qo'shilgan deb taxmin qilinadi.
Java EE konteyner darajasidagi autentifikatsiya
J2eePreAuthenticatedProcessingFilter klassi HttpServletRequest uchun userPrincipal xususiyatidan foydalanuvchi nomini chiqaradi. Ushbu filtrdan foydalanish odatda J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource-ga bag'ishlangan bo'limda tavsiflanganidek, Java EE rollaridan foydalanish bilan birgalikda qo'llaniladi.
Namuna loyihada ushbu yondashuvdan foydalanadigan namuna dastur bor, shuning uchun GitHubdan kodni olib, ilova kontekst fayliga qarang, agar qiziqsangiz.
GO TO FULL VERSION