Eslab qol

All lectures for UZ purposes
Daraja, Dars
Mavjud

Qisqacha Tavsif

Remember-me yoki persistent-login usuli bo'yicha autentifikatsiya foydalanuvchining shaxsini sessiyalar orasida eslab qolishi mumkin bo'lgan veb-saytlarga tegishli. Odatda, bu cookie yuborish orqali amalga oshiriladi, brauzerda cookie topiladi va keyingi sessiyalar davomida tizimga avtomatik kirish imkonini beradi. Spring Security ushbu operatsiyalarni bajarish uchun zaruriy interceptorlarni taqdim etadi va remember-me uchun ikki xil aniq implementatsiyaga ega. Ulardan biri cookie asosidagi tokenlarning xavfsizligini ta'minlash uchun xesh ishlatadi, boshqasi esa tokenlarni saqlash uchun ma'lumotlar bazasi yoki boshqa doimiy saqlash mexanizmini ishlatadi.

Har ikkala implementatsiya UserDetailsService ni talab qiladi. Agar siz UserDetailsService ishlatmaydigan authentifikatsiya provayderini qo‘llayotgan bo‘lsangiz (masalan, LDAP provayderi), unda u UserDetailsService bini ilova kontekstida mavjud bo‘lmasa ishlamaydi.

Xeshga asoslangan tokenlardan foydalanish orqali oddiy yondashuv

Ushbu yondashuv xotira uslubini muvaffaqiyatli amalga oshirish uchun xeshdan foydalanadi. Asosan, interaktiv autentifikatsiyadan so'ng cookie brauzerga yuboriladi, bunda cookie quyidagi elementlardan iborat:

base64(username + ":" + expirationTime + ":" +
md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
username:          UserDetailsService aniqlay oladigan
password:          Olingan UserDetails da mavjud bo'lgan bilan mos kelishi kerak
expirationTime:    Tokenning amal qilish muddati tugash sanasi va vaqti, millisekundlarda ifoda etiladi
key:               Tokenni o'zgartirishdan himoya qilish uchun maxfiy kalit

Shunday qilib, token remember-me faqat belgilangan vaqt davomida va foydalanuvchi ismi, parol va kalit o'zgarmagan taqdirda haqiqiy bo'ladi. Qayd etish joizki, bu holda xavfsizlik bilan bog'liq potensial muammo paydo bo'ladi, chunki olingan token istalgan foydalanuvchi agentidan foydalanish uchun mavjud bo'ladi, toki token amal qilish muddati tugamagan bo'ladi. Bu digest-autentifikatsiya bilan bir xil muammo. Agar foydalanuvchi token o‘g‘irlanganini bilsa, u parolini osongina o‘zgartirishi va darhol barcha chiqarilgan tokenlarni bekor qilishi mumkin. Agar kuchliroq himoya talab etilsa, keyingi bo'limda bayon qilingan yondashuvdan foydalaning. Yoki remember-me xizmatlari umuman ishlatilmasligi kerak.

Nomlar fazosini konfiguratsiya qilish bobida ko'rib chiqilgan mavzular bilan tanish bo'lgan bo'lsangiz, <remember-me> elementini qo'shish orqali eslab qolishni faollashtirishingiz mumkin:

<http>
...
<remember-me key="myAppKey"/>
</http>

Konkretsiya UserDetailsService odatda avtomatik tarzda tanlanadi. Agar ilova kontekstida bir nechta bo'lsa, qaysi biri ishlatilishi kerakligini user-service-ref atributi yordamida belgilang, bu sizning UserDetailsService biningizning ismi.

Doimiy tokenlarga asoslangan yondashuv

Ushbu yondashuv ba'zi kichik o'zgarishlar bilan maqolaga asoslangan http://jaspan.com/improved_persistent_login_cookie_best_practice [1]. Nomlar fazosini konfiguratsiya qilish uchun ushbu yondashuvdan foydalanish uchun datasourcega murojaat qiling:

<http>
...
<remember-me data-source-ref="someDataSource"/>
</http>

Ma'lumotlar bazasida quyidagi SQL (yoki ekvivalent) yordamida yaratilgan persistent_logins jadvali bo'lishi kerak:

create table persistent_logins (username varchar(64) not null,
								series varchar(64) primary key,
								token varchar(64) not null,
								last_used timestamp not null)

Remember-Me Metodi Interfeyslari va Implementatsiyasi

Remember-me metodi UsernamePasswordAuthenticationFilter bilan ishlatiladi va AbstractAuthenticationProcessingFilter superklassida interceptorlar orqali amalga oshiriladi. U BasicAuthenticationFilter da ham ishlatiladi. Interceptorlar muayyan RememberMeServices ni mos keladigan vaqtlarda chaqiradi. Interfeys quyidagicha ko'rinadi:

Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
void loginFail(HttpServletRequest request, HttpServletResponse response);
void loginSuccess(HttpServletRequest request, HttpServletResponse response,
	Authentication successfulAuthentication);

Iltimos, ushbu metodlarning ishlash tamoyillari haqida to'liqroq ma'lumot olish uchun Javadocga murojaat qiling, garchi shu bosqichda AbstractAuthenticationProcessingFilter faqat loginFail() va loginSuccess() metodlarini chaqiradi. autoLogin() metodi har safar SecurityContextHolder da Authentication mavjud bo'lmasa RememberMeAuthenticationFilter tomonidan chaqiriladi. Shuning uchun ushbu interfeys remember-me ning asosiy implementatsiyasini autentifikatsiya bilan bog'liq hodisalar haqida to'g'ri xabardor qilish bilan ta'minlaydi va veb-so'rovda cookie bo'lishi mumkin va uni eslab qolish kerak bo'lgan hollarda vakolatlarni unga topshiradi. Bunday tuzilma remember-me ning turli xil implementatsiya strategiyalaridan foydalanishga imkon beradi. Yuqorida Spring Security'ning ikki implementatsiyani taqdim etishini bilib oldik. Ularni ketma-ket ko'rib chiqamiz.

TokenBasedRememberMeServices

TokenBasedRememberMeServices RememberMeAuthenticationToken ni yaratadi, u RememberMeAuthenticationProvider tomonidan qayta ishlanadi. Ushbu autentifikatsiya provayderi va TokenBasedRememberMeServices bilan key birgalikda ishlatiladi. Bundan tashqari, TokenBasedRememberMeServices UserDetailsService ning nusxasini talab qiladi, undan u foydalanuvchi ismi va imzoni solishtirish uchun parolni olishi, shuningdek, RememberMeAuthenticationToken ni yaratishi va u GrantedAuthority ni to‘g‘ri o‘z ichiga olishini ta’minlashi mumkin. Ilova foydalanuvchi tegishli so'rovni kiritgan taqdirda cookie ni bekor qiluvchi tizimdan chiqish buyruqni ta’minlashi kerak. TokenBasedRememberMeServices Spring Security'dan LogoutHandler interfeysini ham implementatsiya qiladi, shuning uchun LogoutFilter bilan birga cookie ni avtomatik tozalash uchun foydalanish mumkin.

Remember-me xizmatlarini faollashtirish uchun ilova kontekstida bo'lishi kerak bo'lgan binalar ro'yxati quyida keltirilgan:

<bean id="rememberMeFilter" class=
"org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
<property name="rememberMeServices" ref="rememberMeServices"/>
<property name="authenticationManager" ref="theAuthenticationManager" />
</bean>
<bean id="rememberMeServices" class=
"org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<property name="key" value="springRocks"/>
</bean>
<bean id="rememberMeAuthenticationProvider" class=
"org.springframework.security.authentication.RememberMeAuthenticationProvider">
<property name="key" value="springRocks"/>
</bean>

UsernamePasswordAuthenticationFilter.setRememberMeServices() xususiyatiga RememberMeServices implementatsiyasini qo'shishni, AuthenticationManager.setProviders() ro'yxatiga RememberMeAuthenticationProvider ni qo'shishni va FilterChainProxy ga RememberMeAuthenticationFilter ni qo'shishni unutmang (odatda darhol UsernamePasswordAuthenticationFilter dan keyin).

PersistentTokenBasedRememberMeServices

Ushbu klassni TokenBasedRememberMeServices kabi ishlatish mumkin, lekin tokenlarni saqlash uchun PersistentTokenRepository konfiguratsiyasiga qo‘shimcha kiritish kerak. Ikki standart implementatsiya mavjud.

  • InMemoryTokenRepositoryImpl, bu faqat test qilish uchun mo'ljallangan.

  • JdbcTokenRepositoryImpl, bu tokenlarni ma'lumotlar bazasida saqlaydi>

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION