ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണത്തോടുകൂടിയ ഒരു റിയാക്റ്റ്-സ്പ്രിംഗ് ആപ്പിൽ 401 അനധികൃത സ്പ്രിംഗ് സുരക്ഷാ പിശകുകൾ പരിഹരിക്കുന്നു

Authentication

കസ്റ്റം ലോഗിൻ ഇംപ്ലിമെൻ്റേഷനുകളിൽ സ്പ്രിംഗ് സെക്യൂരിറ്റിയുടെ പ്രാമാണീകരണ പ്രശ്നങ്ങൾ ഡീബഗ്ഗിംഗ് ചെയ്യുന്നു

നിങ്ങളുടെ സ്പ്രിംഗ് സെക്യൂരിറ്റി പ്രോജക്റ്റിൽ 401 അനധികൃത പിശക് നേരിടുന്നത് നിരാശാജനകമാണ്, പ്രത്യേകിച്ചും ലോഗിൻ കോൺഫിഗറേഷൻ ശരിയായി സജ്ജീകരിച്ചതായി തോന്നുമ്പോൾ. 😣 പല ഡെവലപ്പർമാരും, സ്പ്രിംഗ് സെക്യൂരിറ്റിയുടെ ഡിഫോൾട്ടിന് പുറത്ത് ഒരു ഇഷ്‌ടാനുസൃത ലോഗിൻ പേജ് നടപ്പിലാക്കുമ്പോൾ, അവരുടെ ആപ്പിൻ്റെ ബാക്കെൻഡ് ഉറവിടങ്ങൾ സുരക്ഷിതമാക്കാൻ ശ്രമിക്കുമ്പോൾ ഈ പ്രശ്‌നം നേരിടുന്നു.

സ്പ്രിംഗ് സെക്യൂരിറ്റിയുടെ ഫോം അധിഷ്‌ഠിത ലോഗിൻ സജ്ജീകരണത്തെ മറികടന്ന്, റിയാക്റ്റ് പോലുള്ള ഒരു ഫ്രണ്ട്-എൻഡ് ഫ്രെയിംവർക്ക് ലോഗിൻ പേജ് നിയന്ത്രിക്കുകയും ബാക്കെൻഡുമായി ആശയവിനിമയം നടത്തുകയും ചെയ്യുമ്പോൾ ഈ പ്രശ്നം ഉണ്ടാകാം. അത്തരം സജ്ജീകരണങ്ങളിൽ, ഒരു ആധികാരിക സെഷൻ തിരിച്ചറിയുന്നതിൽ സ്പ്രിംഗ് സെക്യൂരിറ്റി പരാജയപ്പെട്ടേക്കാം, ഇത് നിങ്ങൾ സംരക്ഷിത ഉറവിടങ്ങൾ ഉപയോഗിക്കാൻ ശ്രമിക്കുമ്പോൾ പ്രവേശനം നിഷേധിക്കപ്പെടുന്നതിന് ഇടയാക്കും.

ഈ ലേഖനത്തിൽ, വിജയകരമെന്നു തോന്നിക്കുന്ന ലോഗിൻ ചെയ്തതിന് ശേഷം ഈ അനധികൃത ആക്‌സസ് പിശകിന് പിന്നിലെ പൊതുവായ കാരണങ്ങളിലേക്ക് ഞങ്ങൾ കടക്കും. സ്‌പ്രിംഗിൻ്റെ സെക്യൂരിറ്റി കോൺടെക്‌സ്‌റ്റിൻ്റെയും സെഷൻ മാനേജ്‌മെൻ്റിൻ്റെയും പങ്ക് മനസ്സിലാക്കുന്നതിലൂടെ, ഒരു ഇഷ്‌ടാനുസൃത സജ്ജീകരണത്തിൽ ഈ പ്രശ്‌നം എങ്ങനെ പരിഹരിക്കാമെന്നതിനെക്കുറിച്ച് നിങ്ങൾക്ക് വ്യക്തത ലഭിക്കും.

നിങ്ങളുടെ അപേക്ഷയിലുടനീളം സുഗമവും അംഗീകൃതവുമായ ആക്‌സസ് പ്രാപ്‌തമാക്കി, നിങ്ങളുടെ പ്രാമാണീകരണ ലോജിക് ശരിയായ സെഷൻ നില സ്ഥിരമായി സജ്ജീകരിക്കുന്നുവെന്ന് ഉറപ്പാക്കാനുള്ള പ്രായോഗിക തന്ത്രങ്ങൾ പര്യവേക്ഷണം ചെയ്യാം. 🚀

കമാൻഡ് ഉപയോഗത്തിൻ്റെ ഉദാഹരണം
sessionManagement സ്പ്രിംഗ് സെക്യൂരിറ്റി HTTP സെഷനുകൾ എങ്ങനെ കൈകാര്യം ചെയ്യുന്നുവെന്ന് ഈ കമാൻഡ് ക്രമീകരിക്കുന്നു. session.sessionCreationPolicy(SessionCreationPolicy.STATELESS) ഉപയോഗിക്കുന്നത്, ഓരോ അഭ്യർത്ഥനയും വ്യക്തിഗതമായി ആധികാരികമാണെന്ന് ഉറപ്പാക്കുന്നു, ഇത് REST-അടിസ്ഥാനത്തിലുള്ള, ടോക്കൺ-ആധികാരിക സജ്ജീകരണങ്ങളിൽ പലപ്പോഴും ഉപയോഗിക്കുന്ന അവസ്ഥയില്ലാത്ത API-കൾക്ക് അത്യന്താപേക്ഷിതമാണ്.
OncePerRequestFilter അഭ്യർത്ഥനയ്‌ക്ക് ഒരൊറ്റ എക്‌സിക്യൂഷൻ ഉറപ്പുനൽകുന്ന ഒരു സ്പ്രിംഗ് സെക്യൂരിറ്റി ഫിൽട്ടറാണ് OncePerRequestFilter. ആവർത്തനമില്ലാതെ ഓരോ അഭ്യർത്ഥനയ്‌ക്കും സ്ഥിരതയാർന്ന പ്രാമാണീകരണ ലോജിക് ബാധകമാണെന്ന് ഉറപ്പാക്കാൻ ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണ ഫിൽട്ടറുകളിൽ ഇത് ഉപയോഗിക്കുന്നു.
SecurityContextHolder SecurityContextHolder.getContext().setAuthentication(authentication) എന്ന് വിളിക്കുന്നതിലൂടെ, ഈ കമാൻഡ് സുരക്ഷാ പശ്ചാത്തലത്തിൽ അംഗീകൃത ഉപയോക്താവിൻ്റെ വിശദാംശങ്ങൾ സജ്ജീകരിക്കുന്നു, സ്പ്രിംഗ് സെക്യൂരിറ്റി നിലവിലെ സെഷനിൽ ആധികാരികതയുള്ള ഉപയോക്താവിനെ അംഗീകരിക്കുന്നുവെന്ന് ഉറപ്പാക്കുന്നു.
DaoAuthenticationProvider ഈ കമാൻഡ് new DaoAuthenticationProvider() ഒരു നിർദ്ദിഷ്ട ഉപയോക്തൃ വിശദാംശ സേവനവും പാസ്‌വേഡ് എൻകോഡറും ഉപയോഗിച്ച് പ്രാമാണീകരണം സജ്ജീകരിക്കുന്നു, ഇത് ഉപയോക്തൃ ഡാറ്റാബേസിനെ അടിസ്ഥാനമാക്കി ഇഷ്‌ടാനുസൃത മൂല്യനിർണ്ണയം അനുവദിക്കുകയും സുരക്ഷിത പാസ്‌വേഡ് കൈകാര്യം ചെയ്യൽ ഉറപ്പാക്കുകയും ചെയ്യുന്നു.
MockMvcRequestBuilders.post mockMvc.perform(MockMvcRequestBuilders.post("/login")) ൽ കാണുന്നത് പോലെ, യൂണിറ്റ് ടെസ്റ്റുകളിലെ ഈ കമാൻഡ് ഒരു HTTP POST അഭ്യർത്ഥന അനുകരിക്കുന്നു. HTTP അഭ്യർത്ഥനകൾ കൺട്രോളറിൻ്റെ അവസാന പോയിൻ്റിലേക്ക് നേരിട്ട് അയച്ചുകൊണ്ട് സ്പ്രിംഗ് എംവിസി കൺട്രോളറുകളുടെ പരിശോധന ഇത് പ്രാപ്തമാക്കുന്നു.
authorizeHttpRequests ഏതൊക്കെ അഭ്യർത്ഥനകൾക്ക് ആധികാരികത ആവശ്യമാണ് എന്നും ഏതൊക്കെ പൊതുവായി ആക്സസ് ചെയ്യാമെന്നും ഈ കമാൻഡ് വ്യക്തമാക്കുന്നു. authorize.requestMatchers("/user/login").permitAll() ക്രെഡൻഷ്യലുകളില്ലാതെ ലോഗിൻ, രജിസ്ട്രേഷൻ എൻഡ് പോയിൻ്റുകൾ ആക്സസ് ചെയ്യാൻ അനുവദിക്കുന്നു.
TokenProvider JWT ടോക്കണുകൾ സൃഷ്ടിക്കുന്നതിനും നിയന്ത്രിക്കുന്നതിനും TokenProvider പോലെയുള്ള ഒരു ഇഷ്‌ടാനുസൃത ക്ലാസ് ഉപയോഗിക്കുന്നു. ടോക്കൺ അധിഷ്‌ഠിത പ്രാമാണീകരണത്തിൽ സുപ്രധാനമായ മോഡുലാർ, പുനരുപയോഗിക്കാവുന്നതും സുരക്ഷിതവുമായ ടോക്കൺ കൈകാര്യം ചെയ്യൽ ഉറപ്പാക്കാൻ ഈ ക്ലാസ് ടോക്കൺ ക്രിയേഷൻ ലോജിക് ഉൾക്കൊള്ളുന്നു.
csrf().disable() Disabling CSRF is critical in stateless API configurations, particularly for REST APIs without session-based login. csrf(csrf ->സ്‌റ്റേറ്റ്‌ലെസ് എപിഐ കോൺഫിഗറേഷനുകളിൽ, പ്രത്യേകിച്ച് സെഷൻ അധിഷ്‌ഠിത ലോഗിൻ ഇല്ലാത്ത REST API-കൾക്ക് CSRF പ്രവർത്തനരഹിതമാക്കുന്നത് നിർണായകമാണ്. csrf(csrf -> csrf.disable()) ടോക്കൺ അധിഷ്ഠിത പ്രാമാണീകരണം ഉപയോഗിക്കുന്ന ആപ്ലിക്കേഷനുകൾക്ക് സാധാരണയായി ആവശ്യമാണ്, കാരണം ഈ സാഹചര്യത്തിൽ CSRF സംരക്ഷണം ആവശ്യമില്ല.
requestMatchers authorize.requestMatchers("/user/register") പോലുള്ള നിർദ്ദിഷ്‌ട സുരക്ഷാ നിയമങ്ങളുമായി പൊരുത്തപ്പെടുന്ന എൻഡ്‌പോയിൻ്റുകൾ ഈ കമാൻഡ് ഫിൽട്ടർ ചെയ്യുന്നു. പ്രാമാണീകരണ ആവശ്യകതകളിൽ നിന്ന് രജിസ്ട്രേഷൻ ഒഴിവാക്കാനും എൻഡ് പോയിൻ്റുകൾ ലോഗിൻ ചെയ്യാനും ഇത് ഇവിടെ ഉപയോഗിക്കുന്നു.
usernamePasswordAuthenticationToken ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണ പ്രക്രിയകളിൽ ഈ കമാൻഡ് അത്യന്താപേക്ഷിതമാണ്. പുതിയ UsernamePasswordAuthenticationToken() നൽകിയ ക്രെഡൻഷ്യലുകൾ ഉപയോഗിച്ച് ഒരു പ്രാമാണീകരണ ടോക്കൺ സൃഷ്ടിക്കുന്നു, സംഭരിച്ച ഉപയോക്തൃ വിശദാംശങ്ങൾക്കെതിരെ ഈ ക്രെഡൻഷ്യലുകൾ പരിശോധിക്കാൻ പ്രാമാണീകരണ മാനേജരെ അനുവദിക്കുന്നു.

ഇഷ്‌ടാനുസൃത ലോഗിൻ പ്രാമാണീകരണത്തിനായുള്ള സ്പ്രിംഗ് സെക്യൂരിറ്റി കോൺഫിഗറേഷൻ മനസ്സിലാക്കുന്നു

നൽകിയിരിക്കുന്ന സ്ക്രിപ്റ്റിൽ, കൈകാര്യം ചെയ്യുന്നതിനുള്ള ഒരു ഇഷ്‌ടാനുസൃത കോൺഫിഗറേഷൻ ഞങ്ങൾ കാണുന്നു സ്പ്രിംഗ് സെക്യൂരിറ്റിയിൽ അതിൻ്റെ ഡിഫോൾട്ട് ലോഗിൻ ഫോം ഉപയോഗിക്കാതെ. ഒരു പ്രത്യേകം സൃഷ്ടിച്ചുകൊണ്ട് കോൺഫിഗറേഷൻ, ഏത് എൻഡ്‌പോയിൻ്റുകൾ സംരക്ഷിക്കപ്പെടുന്നു, സ്പ്രിംഗ് സെഷനുകൾ എങ്ങനെ കൈകാര്യം ചെയ്യുന്നു എന്നതിൻ്റെ നിയന്ത്രണം ഞങ്ങൾ നേടുന്നു. സുരക്ഷിതവും ടോക്കൺ അധിഷ്‌ഠിതവുമായ അഭ്യർത്ഥനകൾ ഉപയോഗിച്ച് ഫ്രണ്ട്എൻഡ് ചട്ടക്കൂട് (റിയാക്റ്റ് പോലെയുള്ളവ) ആശയവിനിമയം നടത്തുന്നതിനാൽ, REST API-കളിൽ സാധാരണമായ CSRF (ക്രോസ്-സൈറ്റ് അഭ്യർത്ഥന ഫോർജറി) പരിരക്ഷ കോൺഫിഗറേഷൻ പ്രവർത്തനരഹിതമാക്കുന്നു. ഇവിടെ, authorizeHttpRequests എന്ന കമാൻഡ് പ്രധാനമാണ്; "/ഉപയോക്താവ്/ലോഗിൻ", "/ഉപയോക്താവ്/രജിസ്റ്റർ" തുടങ്ങിയ നിർദ്ദിഷ്‌ട URL-കൾ എല്ലാ ഉപയോക്താക്കൾക്കും തുറന്നിട്ടുണ്ടെന്ന് ഇത് ഉറപ്പാക്കുന്നു, അതേസമയം സംരക്ഷിത ഉറവിടങ്ങൾ ആക്‌സസ് ചെയ്യുന്നത് പോലെയുള്ള മറ്റ് അഭ്യർത്ഥനകൾ ആധികാരിക ഉപയോക്താക്കൾക്ക് മാത്രമായി പരിമിതപ്പെടുത്തുന്നു.

ഞങ്ങൾ SessionCreationPolicy.IF_REQUIRED ഉപയോഗിച്ച് സെഷൻ സൃഷ്ടിക്കൽ നയവും സജ്ജീകരിച്ചു, അത് ആവശ്യമുള്ളപ്പോൾ മാത്രം സെഷൻ സൃഷ്ടിക്കാൻ അനുവദിക്കുന്നു. ചില അഭ്യർത്ഥനകൾ സെഷൻ അധിഷ്‌ഠിത പ്രാമാണീകരണത്തെ ആശ്രയിക്കുന്ന ആപ്ലിക്കേഷനുകൾക്ക് ഈ സമീപനം അനുയോജ്യമാണ്, എന്നാൽ മറ്റുള്ളവ (ടോക്കണുകൾ ഉള്ളത് പോലെ) അങ്ങനെ ചെയ്യില്ല. ഉദാഹരണത്തിന്, ഒരു ഉപയോക്താവ് റിയാക്റ്റ് ഫ്രണ്ട്എൻഡ് വഴി ലോഗിൻ ചെയ്യുകയും ഉറവിടങ്ങളിലേക്ക് സ്ഥിരമായ ആക്‌സസ് പ്രതീക്ഷിക്കുകയും ചെയ്യുന്നുവെങ്കിൽ, ആപ്ലിക്കേഷനിൽ റൂട്ടുകൾ മാറുമ്പോൾ ഉപയോക്താവിന് ആവർത്തിച്ചുള്ള ലോഗ്ഔട്ടുകൾ നേരിടേണ്ടി വരുന്നില്ലെന്ന് ഈ സെഷൻ നയം ഉറപ്പാക്കുന്നു. ബാക്കെൻഡ് API-യുമായി ക്ലയൻ്റ് (റിയാക്റ്റ് ആപ്പ്) എങ്ങനെ ഇടപഴകുന്നു എന്നതിനെ ആശ്രയിച്ച്, സെഷനും സ്‌റ്റേറ്റ്‌ലെസ് ആവശ്യകതകളും കൈകാര്യം ചെയ്യുന്നതിന് ഇത് പ്രത്യേകിച്ചും സഹായകരമാണ്.

സേവന ക്ലാസിൽ AuthenticateUser എന്ന ഒരു രീതി ഉൾപ്പെടുന്നു, അവിടെ AuthenticationManager ബീൻ പ്രവർത്തിക്കുന്നു. ഈ ബീൻ ഒരു DaoAuthenticationProvider, PasswordEncoder എന്നിവ ഉപയോഗിച്ച് കോൺഫിഗർ ചെയ്‌തിരിക്കുന്നു, ഇത് ഡാറ്റാബേസിനെതിരായ ഉപയോക്തൃ ക്രെഡൻഷ്യലുകൾ പരിശോധിക്കുന്നതിന് അത്യന്താപേക്ഷിതമാണ്. നൽകിയിരിക്കുന്ന ഉപയോക്തൃനാമവും പാസ്‌വേഡും അടിസ്ഥാനമാക്കി പ്രാമാണീകരിക്കാൻ ശ്രമിക്കുന്ന ഒരു ഉപയോക്തൃനാമം പാസ്‌വേഡ് ഓതൻ്റിക്കേഷൻ ടോക്കൺ ഉപയോഗിച്ച് ഈ രീതി authenticationManager.authenticate എന്ന് വിളിക്കുന്നു. വിജയകരമാണെങ്കിൽ, സ്പ്രിംഗ് സെക്യൂരിറ്റിയുടെ സെക്യൂരിറ്റി കോൺടെക്സ്റ്റ് ഹോൾഡർ ഈ അംഗീകൃത ഉപയോക്തൃ സെഷൻ കൈവശം വയ്ക്കുന്നു. ഈ രീതിയിൽ, ഫ്രണ്ട്എൻഡ് മറ്റൊരു അഭ്യർത്ഥന നടത്തുമ്പോൾ, സ്‌പ്രിംഗിന് വീണ്ടും സ്ഥിരീകരണം ആവശ്യമില്ലാതെ തന്നെ ഉപയോക്താവിൻ്റെ പ്രാമാണീകരണ നില വീണ്ടെടുക്കാനാകും.

എന്നിരുന്നാലും, ഈ സജ്ജീകരണം ഉണ്ടായിരുന്നിട്ടും, സെഷനോ ടോക്കണോ ശരിയായി പരിപാലിക്കുന്നില്ലെങ്കിൽ, 401 അനധികൃത പിശക് ലഭിക്കുന്നത് പോലുള്ള പ്രശ്നങ്ങൾ ഉണ്ടാകാം. ഉദാഹരണത്തിന്, സ്‌റ്റേറ്റ്‌ലെസ് സെഷനുകളുള്ള ഒരു REST API ഉപയോഗിക്കുമ്പോൾ, അഭ്യർത്ഥനകൾക്കിടയിൽ സെർവർ ആധികാരികത നിലനിർത്തുന്നില്ലെങ്കിൽ ഈ സജ്ജീകരണം പരാജയപ്പെട്ടേക്കാം. ഇത് പരിഹരിക്കാൻ, ഞങ്ങൾക്ക് ടോക്കൺ അധിഷ്‌ഠിത പ്രാമാണീകരണം നടപ്പിലാക്കാൻ കഴിയും, അവിടെ ലോഗിൻ ചെയ്‌തതിന് ശേഷം ഓരോ അഭ്യർത്ഥന ഹെഡറിലും ഒരു ജനറേറ്റഡ് ടോക്കൺ ഘടിപ്പിച്ചിരിക്കുന്നു, സെഷനെ സെർവറിൽ നിന്ന് സ്വതന്ത്രമാക്കുന്നു. ടെസ്റ്റിംഗ് പരിതസ്ഥിതികളിൽ, MockMvcRequestBuilders ഡെവലപ്പർമാരെ അഭ്യർത്ഥനകൾ അനുകരിക്കാനും ലോഗിൻ എൻഡ്‌പോയിൻ്റ് ശരിയായി ഒരു അംഗീകാര ടോക്കൺ നൽകുന്നുവെന്ന് സ്ഥിരീകരിക്കാനും അനുവദിക്കുന്നു. ഈ ടോക്കൺ പിന്നീട് കൂടുതൽ അഭ്യർത്ഥനകളിൽ ഉപയോഗിക്കാനാകും, ഇത് റിയാക്റ്റ് ഫ്രണ്ട്എൻഡിനെ വീണ്ടും പ്രാമാണീകരിക്കാതെ തന്നെ സുരക്ഷിത എൻഡ്‌പോയിൻ്റുകൾ ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കുന്നു, ഇത് സുഗമമായ ഉപയോക്തൃ അനുഭവം നൽകുന്നു. 🔐

പരിഹാരം 1: സ്‌റ്റേറ്റ്‌ലെസ് സെഷൻ മാനേജ്‌മെൻ്റിനായി സ്‌പ്രിംഗ് സെക്യൂരിറ്റി കോൺഫിഗറേഷൻ അപ്‌ഡേറ്റ് ചെയ്യുന്നു

ഈ സമീപനം REST API സന്ദർഭത്തിൽ സെഷൻ മാനേജ്‌മെൻ്റ് പരിഹരിക്കുന്നതിന് സ്‌പ്രിംഗ് സെക്യൂരിറ്റിയുടെ സ്‌റ്റേറ്റ്‌ലെസ് സെഷൻ പോളിസി ഉപയോഗിക്കുന്നു, ഇത് റിയാക്റ്റ് പോലുള്ള സിംഗിൾ-പേജ് ആപ്ലിക്കേഷനുകൾക്കായി (SPAs) ഒപ്റ്റിമൈസ് ചെയ്‌തിരിക്കുന്നു. ഇവിടെ, ഒരു REST API സ്‌റ്റേറ്റ്‌ലെസ് മോഡലുമായി പൊരുത്തപ്പെടുന്നതിന് ഞങ്ങൾ SecurityFilterChain കോൺഫിഗറേഷൻ ക്രമീകരിക്കുന്നു.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
        .csrf(csrf -> csrf.disable())  // Disable CSRF for REST APIs
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/user/register", "/user/login").permitAll()
            .anyRequest().authenticated()
        )
        .httpBasic(Customizer.withDefaults())
        .sessionManagement(session ->
            session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        )
        .build();
}

പരിഹാരം 2: ടോക്കൺ അടിസ്ഥാനമാക്കിയുള്ള പ്രാമാണീകരണത്തിനുള്ള ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണ ഫിൽട്ടർ

ഈ പരിഹാരത്തിൽ, ഒരു ഇഷ്‌ടാനുസൃത ഫിൽട്ടർ ഉപയോക്താവിനെ പ്രാമാണീകരിക്കുകയും പ്രതികരണ തലക്കെട്ടിൽ ഒരു ടോക്കൺ അറ്റാച്ചുചെയ്യുകയും ചെയ്യുന്നു. ഈ ഫിൽട്ടർ ടോക്കൺ അധിഷ്‌ഠിത പ്രാമാണീകരണം ഉപയോഗിക്കുന്നു, ഇത് RESTful അപ്ലിക്കേഷനുകൾക്ക് അനുയോജ്യമാണ്, കൂടാതെ React ഉപയോഗിച്ച് തടസ്സമില്ലാതെ പ്രവർത്തിക്കാനും കഴിയും.

@Component
public class CustomAuthFilter extends OncePerRequestFilter {
    private final AuthenticationManager authenticationManager;
    public CustomAuthFilter(AuthenticationManager authManager) {
        this.authenticationManager = authManager;
    }
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain)
                                    throws ServletException, IOException {
        String authHeader = request.getHeader("Authorization");
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            String token = authHeader.substring(7);
            Authentication authentication = new UsernamePasswordAuthenticationToken(token, null);
            Authentication authResult = authenticationManager.authenticate(authentication);
            SecurityContextHolder.getContext().setAuthentication(authResult);
        }
        filterChain.doFilter(request, response);
    }
}

പരിഹാരം 3: സേവന ക്ലാസ് ക്രമീകരണങ്ങളും ടോക്കൺ പ്രതികരണവും

ഈ സേവന നിർവ്വഹണം വിജയകരമായ ലോഗിൻ ചെയ്യുമ്പോൾ ഒരു JWT ടോക്കൺ അയയ്ക്കുന്നു, ഓരോ ഫംഗ്ഷനും പരീക്ഷിക്കാവുന്നതും ആപ്ലിക്കേഷനിലുടനീളം പുനരുപയോഗിക്കാവുന്നതുമാണെന്ന് ഉറപ്പാക്കാൻ മോഡുലാർ ഡിസൈൻ ഉപയോഗിക്കുന്നു.

@Service
public class AuthenticationService {
    private final AuthenticationManager authenticationManager;
    private final TokenProvider tokenProvider; // Custom class for generating JWTs
    public AuthenticationService(AuthenticationManager authenticationManager,
                                 TokenProvider tokenProvider) {
        this.authenticationManager = authenticationManager;
        this.tokenProvider = tokenProvider;
    }
    public String authenticateAndGenerateToken(LoginDTO loginDTO) {
        Authentication authentication = authenticationManager
            .authenticate(new UsernamePasswordAuthenticationToken(loginDTO.getUserName(),
                                                                loginDTO.getPassword()));
        SecurityContextHolder.getContext().setAuthentication(authentication);
        return tokenProvider.createToken(authentication);
    }
}

ടോക്കൺ ജനറേഷനും പ്രാമാണീകരണത്തിനുമുള്ള യൂണിറ്റ് ടെസ്റ്റ്

ഈ ജൂണിറ്റ് ടെസ്റ്റ് ആധികാരികത ഉറപ്പാക്കുകയും ടോക്കൺ ജനറേഷൻ ശരിയായി പ്രവർത്തിക്കുകയും സുരക്ഷിതമായ ഉറവിടങ്ങൾ ആക്‌സസ് ചെയ്യുന്നതിനുള്ള പ്രാമാണീകരണം സാധൂകരിക്കുകയും ചെയ്യുന്നു.

@SpringBootTest
@AutoConfigureMockMvc
public class AuthenticationServiceTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private AuthenticationService authenticationService;
    @Test
    public void testAuthenticateAndGenerateToken() throws Exception {
        LoginDTO loginDTO = new LoginDTO("user", "password");
        String token = authenticationService.authenticateAndGenerateToken(loginDTO);
        mockMvc.perform(MockMvcRequestBuilders.post("/login")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\\"userName\\":\\"user\\", \\"password\\":\\"password\\"}"))
                .andExpect(status().isOk())
                .andExpect(header().exists("Authorization"))
                .andExpect(content().string("Successfully Authenticated"));
    }
}

സ്‌റ്റേറ്റ്‌ലെസ് സ്‌പ്രിംഗ് സെക്യൂരിറ്റി ആപ്ലിക്കേഷനുകളിലെ സെഷൻ വെല്ലുവിളികളെ മറികടക്കുന്നു

കേസുകളിൽ സ്‌റ്റേറ്റ്‌ലെസ് എപിഐ കമ്മ്യൂണിക്കേഷനായി കോൺഫിഗർ ചെയ്‌തിരിക്കുന്നു, സെഷൻ മാനേജ്‌മെൻ്റ് തന്ത്രപരമായേക്കാം, പ്രത്യേകിച്ചും ഒരു ഇഷ്‌ടാനുസൃത ലോഗിൻ ഫ്ലോ ഉപയോഗിക്കുമ്പോൾ. സ്‌റ്റേറ്റ്‌ലെസ് കോൺഫിഗറേഷനുകൾ അർത്ഥമാക്കുന്നത് ഓരോ അഭ്യർത്ഥനയും അതിൻ്റേതായ ആധികാരികത ടോക്കൺ ഉണ്ടായിരിക്കണം എന്നാണ്, അത് സെർവർ മുൻ അഭ്യർത്ഥനകളിൽ നിന്ന് സ്വതന്ത്രമായി സാധൂകരിക്കുന്നു. ഒരു ഉപയോക്താവ് ഒരിക്കൽ ലോഗിൻ ചെയ്യുകയും അവരുടെ സെഷൻ സെർവറിൽ നിലനിൽക്കുകയും ചെയ്യുന്ന പരമ്പരാഗത സെഷൻ അടിസ്ഥാനമാക്കിയുള്ള സജ്ജീകരണങ്ങളിൽ നിന്ന് ഇത് വ്യത്യസ്തമാണ്. ആധികാരികത കൈകാര്യം ചെയ്യുന്നതിനും REST API-കൾ വഴി ലോഗിൻ അഭ്യർത്ഥനകൾ അയയ്‌ക്കുന്നതിനും സാധാരണയായി ഉപയോഗിക്കുന്ന റിയാക്‌റ്റ് ഫ്രണ്ട്എൻഡുകൾ ഉപയോഗിച്ച്, ഓരോ API അഭ്യർത്ഥനയും ആധികാരികമാണെന്ന് ഏകീകരണത്തിന് ഉറപ്പാക്കേണ്ടതുണ്ട്, പലപ്പോഴും JWT-കൾ പോലുള്ള ടോക്കണുകൾ ഉപയോഗിക്കുന്നു.

സ്‌പ്രിംഗ് സെക്യൂരിറ്റിയുടെ ഡിഫോൾട്ട് സെഷൻ മാനേജ്‌മെൻ്റ് ഒരു ഇഷ്‌ടാനുസൃത കോൺഫിഗറേഷൻ ഉപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കുമ്പോൾ, ഉപയോക്തൃ ആധികാരികത എങ്ങനെ സജ്ജീകരിക്കാമെന്നും നിലനിർത്താമെന്നും മനസ്സിലാക്കേണ്ടത് പ്രധാനമാണ്. . സെഷനുകളെ ആശ്രയിക്കുന്നതിനുപകരം, അഭ്യർത്ഥന തലക്കെട്ടുകളിൽ ഉൾപ്പെടുത്തിയിരിക്കുന്ന ടോക്കണുകൾ പരിശോധിക്കുന്ന ഒരു ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണ ഫിൽട്ടർ ഉപയോഗിക്കുന്നതാണ് ഇത് പരിഹരിക്കാനുള്ള ഒരു മാർഗം. സെഷൻ പെർസിസ്റ്റൻസ് ഇല്ലാതെ നിങ്ങളുടെ അപ്ലിക്കേഷന് ആവർത്തിച്ചുള്ള ഉപയോക്തൃ ഐഡൻ്റിഫിക്കേഷൻ ആവശ്യമാണെങ്കിൽ, നിങ്ങൾക്ക് ടോക്കൺ ഫ്രണ്ട്എൻഡിൽ പ്രാദേശികമായി സംഭരിക്കാനും ഓരോ അഭ്യർത്ഥനയുടെയും തലക്കെട്ടിൽ ഉൾപ്പെടുത്താനും താൽപ്പര്യപ്പെട്ടേക്കാം. സുരക്ഷിതവും കാര്യക്ഷമവുമായ RESTful API-കൾക്കായി സ്‌റ്റേറ്റ്‌ലെസ് ഡിസൈൻ മോഡലുമായി വിന്യസിച്ച് സെർവറിൻ്റെ സെഷൻ നില ട്രാക്ക് ചെയ്യേണ്ടതിൻ്റെ ആവശ്യകത ഇത് ഇല്ലാതാക്കുന്നു.

കൂടാതെ, സ്‌റ്റേറ്റ്‌ലെസ് ആപ്ലിക്കേഷനുകളിൽ പരിഗണിക്കേണ്ട മറ്റൊരു വശമാണ് ലോഗ്ഔട്ട് ഫംഗ്‌ഷണാലിറ്റി നടപ്പിലാക്കുന്നത്. സെർവറിൽ ഒരു സെഷനും നിലവിലില്ലാത്തതിനാൽ, ലോഗ് ഔട്ട് ചെയ്യുന്നതിൽ സാധാരണയായി ക്ലയൻ്റ് ഭാഗത്ത് നിന്ന് ടോക്കൺ നീക്കംചെയ്യുന്നത് ഉൾപ്പെടുന്നു. ഈ സാഹചര്യത്തിൽ, ക്ലയൻ്റ് ലോക്കൽ സ്റ്റോറേജിലെ ടോക്കൺ നിരസിക്കുകയും സെർവറിലെ ടോക്കൺ ഉപയോഗിച്ചുള്ള അഭ്യർത്ഥനകൾ നിരസിക്കുകയും ചെയ്യുന്നതിലൂടെ വിജയകരമായ ലോഗ്ഔട്ട് നേടാനാകും. സെർവർ സൈഡ് സെഷൻ കൈകാര്യം ചെയ്യാതെ അനധികൃത ആക്‌സസ്സ് തടയുന്നതിലൂടെ ഉയർന്ന സുരക്ഷാ തലങ്ങളെ ഈ രീതി പിന്തുണയ്ക്കുന്നു. ആത്യന്തികമായി, ഈ കോൺഫിഗറേഷൻ സ്കേലബിളിറ്റിക്കും സുരക്ഷയ്ക്കും മുൻഗണന നൽകുന്ന ആപ്ലിക്കേഷനുകൾക്ക് അനുയോജ്യമാണ്, പ്രത്യേകിച്ചും ടോക്കൺ സ്റ്റോറേജ് ഫലപ്രദമായി കൈകാര്യം ചെയ്യാൻ കഴിയുന്ന റിയാക്റ്റ് പോലുള്ള ഫ്രണ്ട്-എൻഡ് ഫ്രെയിംവർക്കുകളുമായി ജോടിയാക്കുമ്പോൾ. 🚀

  1. സജ്ജീകരിച്ചതിന് ശേഷവും എനിക്ക് എന്തുകൊണ്ട് 401 അനധികൃത പിശക് ലഭിക്കുന്നു ?
  2. പ്രാമാണീകരണ സന്ദർഭം നിലനിൽക്കുന്നില്ലെങ്കിൽ 401 പിശക് പലപ്പോഴും സംഭവിക്കുന്നു. നിങ്ങളുടെ ആപ്ലിക്കേഷൻ സ്‌റ്റേറ്റ്‌ലെസ് ആണെങ്കിൽ ടോക്കൺ അധിഷ്‌ഠിത പ്രാമാണീകരണം ഉപയോഗിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക.
  3. സ്പ്രിംഗ് സെക്യൂരിറ്റിയിൽ സ്റ്റേറ്റ്ലെസ് സെഷൻ മാനേജ്മെൻ്റ് എങ്ങനെ പ്രവർത്തനക്ഷമമാക്കാം?
  4. സജ്ജമാക്കുക നിങ്ങളുടെ ഓരോ അഭ്യർത്ഥനയും സ്വതന്ത്രമായി ആധികാരികമാണെന്ന് ഉറപ്പാക്കാൻ.
  5. എന്താണ് പങ്ക് ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണത്തിലോ?
  6. ദി നിങ്ങളുടെ ഡാറ്റാബേസിനെതിരായ ഉപയോക്തൃ ക്രെഡൻഷ്യലുകൾ സ്ഥിരീകരിക്കുകയും സുരക്ഷിതമായ പ്രാമാണീകരണത്തിനായി പാസ്‌വേഡുകൾ എൻകോഡ് ചെയ്യുകയും ചെയ്യുന്നു.
  7. സ്പ്രിംഗ് സെക്യൂരിറ്റിയിൽ സെഷൻ മാനേജ്മെൻ്റിനായി എനിക്ക് JWT ടോക്കണുകൾ ഉപയോഗിക്കാമോ?
  8. അതെ, സ്‌റ്റേറ്റ്‌ലെസ് ആപ്ലിക്കേഷനുകൾക്ക് JWT ടോക്കണുകൾ അനുയോജ്യമാണ്. പ്രാമാണീകരണത്തിന് ശേഷം ഒരു ടോക്കൺ സൃഷ്‌ടിക്കുകയും തുടർന്നുള്ള അഭ്യർത്ഥനകൾക്കായി തലക്കെട്ടിൽ ഉൾപ്പെടുത്തുകയും ചെയ്യുക.
  9. CSRF സംരക്ഷണം സ്‌റ്റേറ്റ്‌ലെസ് എപിഐകളെ എങ്ങനെ ബാധിക്കുന്നു?
  10. CSRF സംരക്ഷണം സാധാരണയായി ഉപയോഗിക്കുന്ന സ്‌റ്റേറ്റ്‌ലെസ് എപിഐകളിൽ പ്രവർത്തനരഹിതമാണ് സെഷനുകളില്ലാത്ത API-കൾക്ക് ഇത് അനാവശ്യമായതിനാൽ.
  11. ലോഗിൻ അല്ലെങ്കിൽ രജിസ്‌റ്റർ പോലുള്ള ചില എൻഡ്‌പോയിൻ്റുകളിലേക്ക് എനിക്ക് പൊതു ആക്‌സസ് അനുവദിക്കണമെങ്കിൽ എന്തുചെയ്യും?
  12. ഉപയോഗിക്കുക കൂടാതെ ആധികാരികത ഇല്ലാതെ ആക്സസ് ചെയ്യാൻ കഴിയുന്ന അവസാന പോയിൻ്റുകൾ വ്യക്തമാക്കുക .
  13. റിയാക്ടിനൊപ്പം ക്ലയൻ്റ് ഭാഗത്ത് ടോക്കണുകൾ എങ്ങനെ സംഭരിക്കാം?
  14. ടോക്കണുകൾ സംഭരിക്കുക അല്ലെങ്കിൽ , ബാക്കെൻഡിന് ഓരോ അഭ്യർത്ഥനയുടെയും ആധികാരികത ഉറപ്പാക്കാൻ ഓരോ അഭ്യർത്ഥനയുടെയും തലക്കെട്ടിൽ അവ ഉൾപ്പെടുത്തുക.
  15. API-കൾക്കായി CSRF പ്രവർത്തനരഹിതമാക്കുന്നത് സുരക്ഷിതമാണോ?
  16. നിങ്ങളുടെ ആപ്പ് ടോക്കണുകളെ ആശ്രയിക്കുകയോ കുക്കികൾ ഉപയോഗിക്കുന്നില്ലെങ്കിലോ API-കൾക്കായി CSRF പ്രവർത്തനരഹിതമാക്കുന്നത് സുരക്ഷിതമാണ്, കാരണം CSRF പ്രധാനമായും കുക്കി അടിസ്ഥാനമാക്കിയുള്ള ആക്രമണങ്ങളിൽ നിന്ന് സംരക്ഷിക്കുന്നു.
  17. എന്താണ് പ്രവർത്തനം ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണത്തിലോ?
  18. ഈ ഫിൽട്ടർ ഓരോ അഭ്യർത്ഥനയിലും ഒരിക്കൽ മാത്രം പ്രവർത്തിക്കുന്നു, അഭ്യർത്ഥന സൈക്കിളിൽ അനാവശ്യ പരിശോധനകളില്ലാതെ പ്രാമാണീകരണ ലോജിക് സ്ഥിരമായി ബാധകമാണെന്ന് ഉറപ്പാക്കുന്നു.
  19. എന്തുകൊണ്ടാണ് എൻ്റെ പ്രാമാണീകരണ ടോക്കൺ വ്യത്യസ്ത എൻഡ് പോയിൻ്റുകളിൽ തിരിച്ചറിയാൻ കഴിയാത്തത്?
  20. ഓരോ അഭ്യർത്ഥനയുടെയും തലക്കെട്ടിൽ നിങ്ങൾ ടോക്കൺ സജ്ജീകരിച്ചിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുകയും സ്ഥിരമായ ടോക്കൺ സ്ഥിരീകരണ പ്രക്രിയ ഉപയോഗിച്ച് സെർവറിൽ ഇത് ശരിയായി സാധൂകരിക്കപ്പെട്ടിട്ടുണ്ടെന്ന് സ്ഥിരീകരിക്കുകയും ചെയ്യുക.
  21. എൻ്റെ സ്പ്രിംഗ് സെക്യൂരിറ്റി കോൺഫിഗറേഷൻ എങ്ങനെ പരിശോധിക്കാം?
  22. ഉപയോഗിക്കുക അഭ്യർത്ഥനകൾ അനുകരിക്കാനും പ്രാമാണീകരണ പ്രതികരണങ്ങൾ പരിശോധിക്കാനും ലോഗിൻ ചെയ്‌തതിനുശേഷം മാത്രമേ പരിരക്ഷിത എൻഡ്‌പോയിൻ്റുകൾ ആക്‌സസ് ചെയ്യാനാകൂ എന്ന് സാധൂകരിക്കാനും നിങ്ങളുടെ ടെസ്റ്റുകളിൽ.

ഒരു ഇഷ്‌ടാനുസൃത ലോഗിൻ പേജ് ഉപയോഗിച്ച് സ്‌പ്രിംഗ് അധിഷ്‌ഠിത അപ്ലിക്കേഷൻ വിജയകരമായി സുരക്ഷിതമാക്കുന്നതിന് ശ്രദ്ധാപൂർവമായ കോൺഫിഗറേഷൻ ആവശ്യമാണ്, പ്രത്യേകിച്ചും സ്‌റ്റേറ്റ്‌ലെസ് സെഷനുകളോ ടോക്കൺ അധിഷ്‌ഠിത സമീപനങ്ങളോ ഉപയോഗിക്കുകയാണെങ്കിൽ. ഒരു റിയാക്‌റ്റ് ഫ്രണ്ട്എൻഡുമായി സംയോജിപ്പിക്കുമ്പോൾ, നിങ്ങളുടെ സുരക്ഷാ കോൺഫിഗറേഷൻ RESTful, സ്‌റ്റേറ്റ്‌ലെസ് തത്വങ്ങളുമായി യോജിപ്പിക്കുന്നുവെന്ന് ഉറപ്പാക്കുന്നത് സെഷൻ പ്രശ്‌നങ്ങൾ ഒഴിവാക്കാൻ സഹായിക്കും.

പരിഷ്ക്കരിക്കുന്നതിൽ നിന്ന് ടോക്കൺ അടിസ്ഥാനമാക്കിയുള്ള ഫ്ലോകൾ നടപ്പിലാക്കുന്നതിനുള്ള ക്രമീകരണങ്ങൾ, ഓരോ സമീപനവും ഒരു വിശ്വസനീയമായ ആധികാരികത സജ്ജീകരണം സൃഷ്ടിക്കുന്നതിൽ ഒരു പങ്കു വഹിക്കുന്നു. സെഷൻ മാനേജ്‌മെൻ്റ്, ടോക്കൺ കൈകാര്യം ചെയ്യൽ, സുരക്ഷാ സന്ദർഭം എന്നിവ മനസ്സിലാക്കുന്നതിലൂടെ, നിങ്ങളുടെ സ്‌പ്രിംഗ് സെക്യൂരിറ്റി ആപ്ലിക്കേഷനുകളിലെ 401 അനധികൃത പിശകുകൾ പരിഹരിക്കാൻ നിങ്ങൾ നന്നായി സജ്ജരായിരിക്കും. 🔒

  1. സ്പ്രിംഗ് സെക്യൂരിറ്റിയുടെ കോൺഫിഗറേഷനും സെഷൻ മാനേജ്മെൻ്റും സംബന്ധിച്ച സമഗ്രമായ വിശദാംശങ്ങൾക്ക്, റഫർ ചെയ്യുക സ്പ്രിംഗ് സെക്യൂരിറ്റി ഔദ്യോഗിക ഡോക്യുമെൻ്റേഷൻ .
  2. ഒരു റിയാക്റ്റ് ഫ്രണ്ട്എൻഡ് ഉപയോഗിച്ച് ഇഷ്‌ടാനുസൃത പ്രാമാണീകരണം ഫ്ലോകൾ മനസിലാക്കാനും നടപ്പിലാക്കാനും, ഗൈഡ് കാണുക സ്പ്രിംഗ് സെക്യൂരിറ്റിയും റിയാക്റ്റ് ലോഗിൻ ട്യൂട്ടോറിയലും .
  3. ഈ ലേഖനത്തിൻ്റെ കോൺഫിഗറേഷൻ ഉദാഹരണങ്ങളും സ്പ്രിംഗ് ബൂട്ട് സജ്ജീകരണവും ഉൾക്കാഴ്ചകളെ അടിസ്ഥാനമാക്കിയുള്ളതാണ് Baeldung സ്പ്രിംഗ് സെക്യൂരിറ്റി സെഷൻ ഗൈഡ് .