Adakah penapis keselamatan musim bunga mendapat maklumat sesi daripada redis?
Editor PHP Zimo berada di sini untuk menjawab soalan sama ada penapis Spring Security memperoleh maklumat sesi daripada Redis. Spring Security ialah rangka kerja keselamatan yang berkuasa yang menyediakan set lengkap mekanisme pengesahan dan kebenaran. Secara lalai, Spring Security menggunakan HttpSession untuk mengurus maklumat sesi pengguna. Walau bagaimanapun, dengan konfigurasi, kami boleh menyimpan maklumat sesi dalam storan luaran seperti Redis. Kelebihan ini ialah ia dapat merealisasikan pengurusan sesi teragih dan meningkatkan kebolehskalaan sistem. Oleh itu, penapis Spring Security boleh mendapatkan maklumat sesi daripada Redis.
Kandungan soalan
Saya cuba menggunakan spring-boot, spring-security dan spring-session untuk melaksanakan sistem log masuk dan menggunakan redis sebagai storan sesi.
Konfigurasi saya:
@enablewebsecurity @enablemethodsecurity @configuration @requiredargsconstructor public class securityconfig { private final userdetailsservice detailsservice; @bean public passwordencoder passwordencoder() { return new bcryptpasswordencoder(); } @bean public authenticationprovider authenticationprovider(passwordencoder passwordencoder) { daoauthenticationprovider provider = new daoauthenticationprovider(); provider.setpasswordencoder(passwordencoder); provider.setuserdetailsservice(this.detailsservice); return provider; } @bean public authenticationmanager authenticationmanager(authenticationprovider authenticationprovider) { return new providermanager(authenticationprovider); } @bean public securityfilterchain filterchain(httpsecurity http) throws exception { return http .csrf().disable() .cors(customizer.withdefaults()) .authorizehttprequests(auth -> { auth.requestmatchers("/api/v1/auth/register/**", "/api/v1/auth/login").permitall(); auth.anyrequest().authenticated(); }) .sessionmanagement(sessionmanagement -> sessionmanagement .sessioncreationpolicy(if_required) // .sessionfixation(sessionmanagementconfigurer.sessionfixationconfigurer::newsession) // .maximumsessions(100000) // //.sessionregistry(sessionregistry()) ) //.exceptionhandling((ex) -> ex.authenticationentrypoint(this.authentrypoint)) .logout(out -> out .logouturl("/api/v1/auth/logout") .invalidatehttpsession(true) // invalidate all sessions after logout .deletecookies("jsessionid") .logoutsuccesshandler((request, response, authentication) -> securitycontextholder.clearcontext() ) ) .build(); } @bean public securitycontextrepository securitycontextrepository() { return new httpsessionsecuritycontextrepository(); } }
Pengawal log masuk saya:
@postmapping("/login") public void login(@requestbody loginform form, httpservletrequest request, httpservletresponse response) { string ip = httprequestutil.getip(request); string device = httprequestutil.getdevice(request); loginformwrapper loginformwrapper = new loginformwrapper(form.email(), form.password(), ip, device); authenticationservice.login(loginformwrapper, request, response); }
dan perkhidmatan pengesahan:
@override public void login(loginformwrapper form, httpservletrequest request, httpservletresponse response) { authentication authentication = authenticationmanager.authenticate(usernamepasswordauthenticationtoken.unauthenticated( form.email().trim(), form.password())); // create a new context securitycontext context = securitycontextholder.createemptycontext(); context.setauthentication(authentication); // update securitycontextholder and strategy this.securitycontextholderstrategy.setcontext(context); this.securitycontextrepository.savecontext(context, request, response); }
Jika saya faham betul
this.securitycontextholderstrategy.setcontext(context);
Pengesahan hendaklah disimpan dalam ingatan aplikasi, cth. dalam konteks threadlocal
dan
`this.securitycontextrepository.savecontext(context, request, response);`
Maklumat sesi hendaklah disimpan ke redis.
Sekarang apabila saya log masuk saya melihat data telah disimpan ke redis:
Namun, apabila menyemak permintaan log masuk saya yang dikembalikan, saya melihat:
Id sesi yang sama sekali berbeza.
Soalan pertama saya ialah: Mengapa id ini tidak sepadan? Bagaimanakah musim bunga tahu kunci mana yang hendak dicari?
Soalan lain ialah: penapis apa untuk mendapatkan data daripada redis? Saya cuba nyahpepijat semua penapis dalam rantai penapis:
[org.springframework.security.web.session.DisableEncodeUrlFilter@2fedae96, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4945cd1f, org.springframework.security.web.context.SecurityContextHolderFilter@72499396, org.springframework.security.web.header.HeaderWriterFilter@7048d039, org.springframework.web.filter.CorsFilter@2dbfcbe4, org.springframework.security.web.authentication.logout.LogoutFilter@5d5a77de, org.springframework.security.web.session.ConcurrentSessionFilter@1f8e1096, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@651bec9a, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@76d4e1af, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6f13ed1, org.springframework.security.web.session.SessionManagementFilter@642693c2, org.springframework.security.web.access.ExceptionTranslationFilter@2199e1a4, org.springframework.security.web.access.intercept.AuthorizationFilter@48c584c]
Tetapi ia seolah-olah membaca maklumat sesi dari httpserletrequest entah bagaimana - namun, jika saya mengeluarkan kunci daripada redis, pengesahan untuk titik akhir yang memerlukannya gagal.
Adakah saya terlepas sesuatu? Adakah saya mendapatkan semula maklumat sesi daripada redis dan menyimpannya dalam httpservlerrequest
sebelum jururawat saya bermula? Atau bagaimana ia membaca data redis?
Terima kasih atas bantuan anda.
Penyelesaian
Nilai dalam kuki sesi adalah dikodkan base64:
echo '3c048eae-9f73-4df5-a009-bdf802ae37ca' | openssl base64 m2mwndhlywutowy3my00zgy1lwewmdktymrmodayywuzn2nhcg==
echo 'M2MwNDhlYWUtOWY3My00ZGY1LWEwMDktYmRmODAyYWUzN2NhCg==' | openssl base64 -d 3c048eae-9f73-4df5-a009-bdf802ae37ca
Jadi apabila base64 dinyahkod, id sesi kuki sepadan dengan id sesi yang disimpan dalam redis.
Jika anda belum membacanya lagi, saya akan mengesyorkan dokumen ini: https://www.php.cn/link/e27c71957d1e6c223e0d48a165da2ee1
Terutama bahagian "Memahami Komponen Pengurusan Sesi": https://www.php.cn/link/e27c71957d1e6c223e0d48a165da2ee1#memahami-komponen-pengurusan-sesi
Anda tidak menyebut versi keselamatan musim bunga yang anda gunakan, tetapi saya rasa anda menggunakan keselamatan musim bunga 6. Dalam bahagian ini, terdapat ayat sedemikian yang berkaitan dengan pengesahan sesi:
Atas ialah kandungan terperinci Adakah penapis keselamatan musim bunga mendapat maklumat sesi daripada redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



我有下面的代码:publicSecurityFilterChainsecurityFilterChain(HttpSecurityhttp)throwsException{returnhttp.httpBasic().disable().cors().and().csrf().disable().authorizeHttpRequests().requestMatchers("

Cara menggunakan Java untuk membangunkan sistem log masuk tunggal berdasarkan SpringSecuritySAML Pengenalan: Dengan perkembangan pesat Internet, semakin banyak aplikasi dibangunkan. Dalam aplikasi ini, log masuk pengguna adalah salah satu ciri yang paling biasa. Walau bagaimanapun, untuk aplikasi peringkat perusahaan, pengguna perlu log masuk dalam berbilang sistem, yang akan membawa kepada pengalaman log masuk pengguna yang sangat lemah. Untuk menyelesaikan masalah ini, sistem log masuk tunggal (SingleSign-On, dirujuk sebagai SSO) telah wujud. ringkas

Saya cuba melaksanakan pengesahan token akses menggunakan GO. Tetapi contoh yang saya lihat dalam talian nampaknya hanya menggunakan TOKEN_SECRET untuk mengesahkannya. Tetapi saya sudah biasa dengan pengaturcaraan dalam Javaspring dan tidak perlu menggunakan TOKEN_SECRET. Saya hanya menyediakan jwk-set-uri dan ia menyemak kesahihan (penapis keselamatan automatik dsb.) dan saya tahu ia bercakap dengan pelayan oauth dan melakukan pengesahan ini. Adakah tiada perpustakaan dalam Go untuk menyemak sama ada token itu sah dengan membuat permintaan kepada pelayan oauth? Saya tahu saya tahu saya boleh melakukan ini secara manual dengan membuat permintaan ke titik akhir info pengguna pelayan oauth: http://localh

Dalam sistem pengurusan bahagian belakang, kawalan kebenaran akses biasanya diperlukan untuk mengehadkan keupayaan pengguna yang berbeza untuk mengakses antara muka. Jika pengguna tidak mempunyai kebenaran khusus, dia tidak boleh mengakses antara muka tertentu. Artikel ini akan menggunakan projek waynboot-mall sebagai contoh untuk memperkenalkan cara memperkenalkan rangka kerja kawalan kebenaran SpringSecurity ke dalam sistem pengurusan back-end biasa. Garis besarnya adalah seperti berikut: alamat projek waynboot-mall: https://github.com/wayn111/waynboot-mall 1. Apakah SpringSecurity SpringSecurity ialah projek sumber terbuka berdasarkan rangka kerja Spring, bertujuan untuk menyediakan keselamatan yang berkuasa dan fleksibel untuk aplikasi Java.

Cara menggunakan Java untuk membangunkan sistem log masuk tunggal berdasarkan SpringSecurityOAuth2 Pengenalan: Dengan perkembangan pesat Internet, semakin banyak laman web dan aplikasi memerlukan pengguna untuk log masuk, tetapi pengguna tidak mahu mengingati setiap laman web atau aplikasi. Nombor akaun dan kata laluan. Sistem log masuk tunggal (SingleSign-On, dirujuk sebagai SSO) boleh menyelesaikan masalah ini, membenarkan pengguna mengakses berbilang tapak web dan aplikasi tanpa pengesahan berulang selepas log masuk sekali. Artikel ini akan memperkenalkan

Saya mempunyai perkhidmatan springrest dan saya mahu menggunakannya untuk kedua-dua pengguna yang disahkan dan tidak disahkan. Jika pengguna disahkan, saya ingin mendapatkan maklumat pengguna daripada securitycontextholder.getcontext().getauthentication(). Jika saya menggunakan .antmatchers("/app/rest/question/useroperation/list/**").permitall() dalam konfigurasi ouath2 seperti yang ditunjukkan di bawah, maka saya boleh mendapatkan maklumat pengguna pengguna yang disahkan, tetapi bukan Pengguna yang disahkan akan muncul 40

Pengenalan Dalam dunia yang saling berkaitan hari ini, API RESTful telah menjadi mekanisme utama untuk komunikasi antara aplikasi. Dengan Java, bahasa pengaturcaraan yang berkuasa, anda boleh membina API RESTful yang cekap, berskala dan diselenggara dengan baik. Bab 1: Prinsip Asas RESTfulAPI dan Amalan Terbaik Seni Bina RESTful Kaedah Http, kod status dan pengepala respons Format data seperti JSON dan XML Bab 2: Reka Bentuk dan Pemodelan RESTfulAPI RESTfulAPI Prinsip Reka Bentuk Pemodelan Sumber dan Kawalan Versi Reka Bentuk URI dan HATEOAS Bab 3: Menggunakan SpringBoot untuk membina pengenalan SpringBoot API RESTful dan mula membina dan

Vue.js dan Spring Boot berinteraksi melalui: RESTful API: Vue.js menggunakan Axios untuk menghantar permintaan HTTP tak segerak dan Spring Boot menyediakan pelaksanaan API RESTful. Penghantaran data: Data dihantar melalui permintaan dan respons, seperti badan permintaan atau parameter pertanyaan. Kaedah permintaan: Kaedah permintaan HTTP seperti GET, POST, PUT dan DELETE digunakan untuk menentukan operasi. Penghalaan: Anotasi Spring Boot @RequestMapping mentakrifkan penghalaan pengawal dan Vue.js menggunakan Penghala Vue untuk mentakrifkan penghalaan antara muka. Pengurusan negeri: Vu