Auto-generate Flow Chart from Java/C++ Codes:

Raptor Flowchart Tutorial For Beginners

Monday, November 05, 2018

Lindungi Keselamatan Laman Web Menggunakan Java Spring Boot

Boot Spring sebenarnya sangat mudah ...


.
Dalam tulisan ini, saya akan menerangkan bagaimana Spring menguruskan keselamatan. Saya tidak akan meliputi segala-galanya, sudah tentu - isu keselamatan akan menjadi buku besar, tetapi kami sekurang-kurangnya akan melihat bagaimana untuk mendapatkan laman web.
Seperti biasa, saya ingin bermula dengan mengatakan bahawa kod sumber boleh didapati di halaman GitHub saya. Program ini dibuat di Java menggunakan Spring Boot.
Nah, mari kita mulakan dengan melihat cara untuk mendapatkan laman web di Spring.
Boot Spring sebenarnya sangat mudah kerana kami akan menggunakan apa yang permulaan permulaan Spring, yang tidak lain hanyalah kumpulan pakej yang dikelompokkan oleh fungsi yang mereka tawarkan. Jadi dalam kes ini, pakej itu akan termasuk Web, Thymeleaf, dan, tentu saja, Keselamatan.
Berikut adalah sekilas Eclipse untuk memilih pakej yang diperlukan.
Tajuk imej
Sebilangan besar daripada anda sudah tahu, dependensi fail pom.xml membolehkan anda melihat lebih terperinci.
Thymeleaf adalah perisian yang mengintegrasikan dengan lancar dengan Spring dan mencipta templat laman web. Ini serupa dengan JSP, tetapi Thymeleaf adalah versi yang lebih baik. Atau, jika anda lebih suka JavaServer Faces, ia akan kelihatan seperti JavaEE. Kesnya adalah bahawa ia membolehkan halaman HTML untuk mengintegrasikan dengan lancar dengan kelas kami yang dibangunkan di Spring.
Oleh kerana kami ingin melihat di laman web kami, nama pengguna yang kami rakamkan membolehkan kami menggunakan keselamatan perpustakaan Thymeleaf untuk Spring. Untuk melakukan ini, kami akan memasukkan baris berikut dalam fail pom.xml kami.
 org.thymeleaf.extras   thymeleaf-extras-springsecurity4   3.0.3.RELEASE   

Dan di sini, anda dapat melihat bagaimana ia akan menyusun program kami
Tajuk imej
Kini, kami mula mengisytiharkan kelas pertama kami, yang telah dipanggil WebSecurityConfiguration.java:
 @SpringBootApplication @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { public static void main (String [] args) { SpringApplication.run (WebSecurityConfiguration.class, args); } @Bean @Override public AuthenticationManager authenticationManagerBean () throws Exception { super.authenticationManagerBean return (); } @Bean @Override public UserDetailsService userDetailsService () { UserDetails user = User.builder (). Username ( "user"). Password (passwordEncoder (). Encode ( "secret")). roles ( "USER") build ().; UserDetails UserAdmin = User.builder (). Username ( "admin"). Password (passwordEncoder (). Encode ( "secret")). roles ( "ADMIN") build ().; return new InMemoryUserDetailsManager (user, UserAdmin); } @Bean public PasswordEncoder passwordEncoder () { return new BCryptPasswordEncoder (); } @Override protected void set (http HttpSecurity) throws Exception { http .csrf (). disable () .authorizeRequests () .antMatchers ( "/" "/ index", "/ webpublico"). permitAll () .antMatchers ( "/ webprivado"). authenticated () .antMatchers ( "/ webadmin"). hasRole ( "ADMIN"). and () .formLogin () .loginPage ( "/ login") .permitAll () .and () .logout () // get method for I desabilitado CSRF .permitAll (); } } 

Yang pertama ialah menggunakan label @SpringBootApplication  dan @EnableWebSecurity . Teg pertama adalah jelas - sejak permohonan kami, kami mahu bekerja dengan Spring Boot.Yang kedua adalah untuk menentukan bahawa keselamatan web diaktifkan; jujur, label ini tidak diperlukan. Boot Spring sangat pandai, seperti yang kita lihat keselamatan pakej (dalam pom.xml, ingat) dalam projek kami. Ia termasuk mesej ini sekali lagi, yang tidak semestinya sesuatu yang buruk, kerana ia memberikan penjelasan lebih lanjut tetapi, walaupun, berlebihan.
Sekarang, kami menyatakan bahawa kelas kami akan mewarisi dari WebSecurityConfigurerAdapter kerana kita akan menimpa beberapa fungsi kelas itu. Jadi, anda perlu memahami Spring dan melihat apakah terdapat kelas yang mengimplementasikan antara muka WebSecurityConfigurer , yang mengimplementasikan WebSecurityConfigurerAdapterkelas, dan jika ya, ia menggunakan fungsi antara muka itu untuk mengkonfigurasi aplikasi keselamatan.
Sekiranya kita mempunyai kelas yang menggunakan antara muka ini, Spring tidak akan dapat mengakses mana-mana halaman permohonan kami, yang mungkin difahami oleh anda, tidak praktikal.
Kini, kita perlu menulis fungsi authenticationManagerBean  untuk memulangkan kelas yang bertanggungjawab untuk mengurus pengesahan (seperti namanya). Baiklah, anda mungkin tertanya-tanya: tetapi bagaimana pula jika anda hanya memanggil fungsi untuk menentukan? Ini sebenarnya sangat mudah kerana kita menggunakan @Bean   label untuk Spring. Adalah penting untuk mengetahui di mana untuk mendapatkan (menyuntikkan) jenis objek AuthenticationManager   kerana anda perlu mengawal keselamatan.
Dalam fungsi userDetailsService , kami menentukan pengguna yang akan mempunyai akses ke laman web kami. Dalam kes ini, kami mencipta dua pengguna: pengguna dan admin (ya, saya tahu bahawa saya tidak cuba terlalu keras memilih nama itu), masing-masing mempunyai kata laluan dan peranannya sendiri. Jelaskan bahawa ROLE adalah harfiah percuma, yang bermaksud bahawa ini boleh menjadi apa sahaja yang anda mahukan. Contohnya, USER_WITH_EYES - hakikatnya, maka kita akan menggunakan peranan itu, ia harus sepadan dengan surat dengan huruf dengan set.
Juga, ambil perhatian bahawa kata laluan disulitkan, dalam kes ini, dengan Bcrypt algoritma. Kami melakukan ini dengan memanggil passwordEncoder @Bean , yang dijelaskan dengan Spring @Bean   label.
Maksudnya, Spring perlu mengetahui sistem penyulitan yang kita gunakan untuk menyimpan kata laluan, dan ia mencari objek yang menggunakan PasswordEncoder antara muka. Jika kita gagal, kita tidak dapat mencari permohonan itu.
Saya ingin menjelaskan bahawa kami menggunakan cara paling mudah untuk mengisytiharkan pengguna dan menyimpannya, dalam ingatan, dengan kelas InMemoryUserDetailsManager . Dalam program sebenar, ia akan menggunakan JdbcUserDetailsManager , yang membolehkan kami menyimpannya dalam pangkalan data. Atau, ini boleh termasuk mana-mana kelas lain yang melaksanakan antara muka UserDetailsManager , kerana ia boleh menjadi LdapUserDetailsManager   jika kita menggunakan perkhidmatan LDAP.
Dan kerana kita perlu menentukan bahagian mana aplikasi kita akan dilindungi, peranan mesti mempunyai kebenaran untuk mengakses setiap bahagiannya. Ya, saya telah menulis peranan dan bukan pengguna, kerana seperti yang telah kami katakan sebelum ini, apabila anda menentukan pengguna, anda mesti menetapkan peranan. Dan biasanya, peraturan penapisan digunakan oleh kumpulan yang dimiliki pengguna.Untuk menetapkan keizinan untuk setiap sumber, kami akan mengkonfigurasi objek HttpSecurity yang diterima dalam konfigurasi batal fungsi yang dilindungi (HttpSecurity http).
Saya akan menjelaskan garis demi baris apa yang dilakukan dalam fungsi ini:
  • csrf (). disable () 
Pertama, kita melihat CSRF mengawal kawalan. CRSF bermaksud pemalsuan permintaan Cross Site , seperti yang dijelaskan oleh Wikipedia:
Pemalsuan permintaan silang tapak , yang juga dikenali sebagai serangan satu klik atau menunggang sesi dan disingkat CSRF (kadang-kadang disebut surfing laut ) atau XSRF , adalah sejenis eksploit yang berniat jahat di laman web di mana arahan yang tidak dibenarkan dihantar daripada pengguna web amanah permohonan. Terdapat banyak cara di mana tapak web berniat jahat boleh menghantar arahan tersebut; Contohnya, tag imej khusus, bentuk tersembunyi, dan JavaScript XMLHttpRequests, misalnya, semuanya boleh berfungsi tanpa interaksi pengguna atau pengetahuan. Tidak seperti skrip silang tapak (XSS), yang mengeksploitasi kepercayaan pengguna untuk laman web tertentu, CSRF mengeksploitasi kepercayaan bahawa tapak mempunyai dalam pelayar pengguna.
Melumpuhkan CRSF mempunyai kesan sampingan yang boleh melakukan log keluar sesi dengan permintaan HTTP GET jenis, maka lalai hanya dapat dilakukan dengan permintaan POST:
  • .authorizeRequests () .antMatchers ( "/" "/ index", "/ webpublico"). permitAll ()
Kami menyatakan bahawa petisyen di laluan ini dengan mana-mana rentetan "/", "/ index", "/ webpublico" tidak akan mempunyai keselamatan. Itu dibenarkan untuk semua orang.
  • antMatchers ( "/webprivado"). authenticated ()   
Kami menyatakan bahawa permintaan ke laluan "/ webprivado" boleh   hanya diproses jika pengguna disahkan, tanpa menentukan peranan apa yang perlu dimiliki.
  • .antMatchers ( "/webadmin"). hasRole ( "ADMIN")   
Hanya pengguna yang menjadi sebahagian daripada ADMINkumpulan akan mempunyai akses ke URL "/ webadmin."
Fungsi antMatchers   membolehkan penggunaan ungkapan biasa, jadi jika, misalnya, kami ingin memohon peraturan kepada semua yang bergantung pada laluan, kami boleh meletakkan ini:
http.antMatchers ("/ users / **"). hasRole ("USER") untuk menentukan bahawa sebarang permintaan kepada URL / pengguna / XXX hanya mempunyai akses kepada pengguna milik kumpulan USER.
  • .formLogin(). loginPage( "/login"). permitAll()   
Kami menyatakan bahawa halaman masuk akan " / login " dan dibenarkan untuk sampai kepada semua orang.
  • logout(). permitAll()   
Kami menyatakan halaman logout harus dibenarkan untuk mencapai semua orang. Secara lalai, halaman ini jawapan dalam URL " / logout ."
Sempurna. Kami telah menentukan keselamatan laman web kami. Kini, kami hanya menetapkan titik masuk ke halaman.Ini dilakukan di kelas WebController.java .
 @Controller public class WebController { @RequestMapping ({ "/", "index"}) public String start () { return "index"; } @RequestMapping ( "/webprivado") public private String () { "Private" return; } @RequestMapping ( "/webpublico") public String loginpub () { "Public" return; } @RequestMapping ( "/webadmin") public String admin () { return "admin"; } @RequestMapping ( "/login") public String login () { return "login"; } } 

Seperti yang dilihat di atas, kelas mempunyai banyak misteri.W hanya tentukan label @Controller untuk menjadi kelas di mana kita boleh menentukan titik kemasukan untuk permintaan web.
Kami mempunyai fungsi yang berlainan dalam label @RequestMapping   untuk menentukan URL dan diproses oleh setiap fungsi. Oleh itu, permulaan fungsi akan dipanggil apabila permintaan kepada URL, " / " atau " / indeks ."Perhatikan bahawa kita perlu dimasukkan ke dalam bar awal.
Rentetan yang dikembalikan akan menjadi template yang Thymeleaf dikembalikan supaya fungsi mula panggilan akan mengembalikan templat "index.html", seperti ditunjukkan di bawah:
 <! DOCTYPE html>    Home Page </ title> </ Head> <body> <h1>
 Home Page </ h1> <p>
 <a th:href="@{/webpublico}"> Click here to view a page </a> public. </ P> <p>
 If you are a regular user clicks </a> <a th:href="@{/webprivado}"> here to view a private page </ p> <p>
 If you are a regular administrator </a> click <a th:href="@{/webadmin}"> here to see the profile Administrator </ p> <div sec: Authorize = "isAuthenticated ()">
 Hello <span sec: authentication = "name"> someone </ span> <p>
 <a th:href="@{/logout}"> Disconnect </a> </ p> </ Div> </ Body> </ Html></code> </pre>
<p pid="40" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<br style="box-sizing: border-box;"></p>
<p pid="41" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;">Bagaimanakah ia kelihatan seperti HTML tulen?</span> <span class="notranslate" style="box-sizing: border-box;">Ini adalah salah satu kelebihan menggunakan tag HTML standard Thymeleaf.</span> <span class="notranslate" style="box-sizing: border-box;">Saya tidak akan menjelaskan bahasa di sini, tetapi saya akan menerangkan beberapa label yang digunakan:</span></p>
<p pid="42" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><a th: href="@{/webpublico}"></strong> - Buat pautan ke URL " <strong style="box-sizing: border-box;">/</strong>webpublico."</span> <span class="notranslate" style="box-sizing: border-box;">Ia seperti menggunakan "tag <strong style="box-sizing: border-box;"><a href="/webpublico"></strong> .</span></p>
<p pid="43" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><div sec: Authorize = "isAuthenticated ()">
</strong> -</span> <strong style="box-sizing: border-box;"> </strong> <span class="notranslate" style="box-sizing: border-box;">Ini adalah satu-satunya kod yang akan diberikan di DIV jika pengguna disahkan.</span> <span class="notranslate" style="box-sizing: border-box;">Dengan kata lain, jika pengguna tidak log masuk, ia tidak dipaparkan di laman web yang antara tag DIV (sebenarnya, ia tidak akan dipaparkan pada halaman web atau DIV).</span></p>
<p pid="44" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><span sec: authentication = "name"> someone </ span></strong> - Jika pengguna log masuk dengan nama pengguna mereka, ia akan menunjukkan apa yang anda ada di antara tag <strong style="box-sizing: border-box;">span.</strong></span><span class="notranslate" style="box-sizing: border-box;">Dalam kes ini, ia menunjukkan seseorang.</span></p>
<p pid="45" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;">Dan dengan ini, kami mempunyai aplikasi yang selamat!</span> <span class="notranslate" style="box-sizing: border-box;">Ya, kami mengamankan halaman web dengan hanya dua kelas Java dan fail HTML yang sesuai.</span></p>
<p pid="46" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;">Untuk menyelesaikan siaran ini, saya meninggalkan beberapa tangkapan skrin aplikasi:</span></p>
<p pid="47" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<img alt="Tajuk imej" class="fr-fin fr-dib" src="https://dzone.com/storage/temp/10534853-captura-12.png" width="655" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 100%; height: auto; text-align: center; margin: auto; display: block; float: none !important;"></p>
<figure id="attachment_393" style="box-sizing: border-box; margin: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);"><figcaption style="box-sizing: border-box; clear: both; font-size: 16px; margin: 0px 0px 30px 10px; line-height: 1.2; color: rgb(115, 121, 129);"><span class="notranslate" style="box-sizing: border-box;">Ini adalah halaman rumah tanpa mendaftar.</span></figcaption></figure><figure id="attachment_393" style="box-sizing: border-box; margin: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);"><figcaption style="box-sizing: border-box; clear: both; font-size: 16px; margin: 0px 0px 30px 10px; line-height: 1.2; color: rgb(115, 121, 129);"><p style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px;">
<img alt="Tajuk imej" class="fr-fin fr-dib" src="https://dzone.com/storage/temp/10534857-captura1-1.png" width="654" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 100%; height: auto; text-align: center; margin: auto; display: block; float: none !important;"><span class="notranslate" style="box-sizing: border-box;">Ini adalah halaman awam.</span></p>
<p style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px;">
<img alt="Tajuk imej" class="fr-fin fr-dib" src="https://dzone.com/storage/temp/10534866-captura5.png" width="685" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 100%; height: auto; text-align: center; margin: auto; display: block; float: none !important;"></p>
</figcaption></figure><p pid="48" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;">Ini kelihatan di laman utama sebaik sahaja ia mengenal pasti 'pengguna'.</span></p>
<p pid="49" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<img alt="Tajuk imej" class="fr-image-dropped fr-fin fr-dib" src="https://dzone.com/storage/temp/10534867-captura2.png" width="600" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 100%; height: auto; text-align: center; margin: auto; display: block; float: none !important;"></p>
<p pid="50" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;">Sekarang, kami mengenal pasti pengguna "pengguna:"</span></p>
<p pid="51" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<img alt="Tajuk imej" class="fr-fin fr-dib" src="https://dzone.com/storage/temp/10534869-captura4.png" width="704" style="box-sizing: border-box; border: 0px; vertical-align: middle; max-width: 100%; height: auto; text-align: center; margin: auto; display: block; float: none !important;"></p>
<figure id="attachment_397" style="box-sizing: border-box; margin: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);"><figcaption style="box-sizing: border-box; clear: both; font-size: 16px; margin: 0px 0px 30px 10px; line-height: 1.2; color: rgb(115, 121, 129);"><span class="notranslate" style="box-sizing: border-box;">Sekarang, kita dapat melihat ralat mengakses laman web;</span> <span class="notranslate" style="box-sizing: border-box;">" <b style="box-sizing: border-box;">/ admin</b> " didaftarkan dengan pengguna pengguna 'dan tidak mempunyai keizinan untuk laman web itu.</span></figcaption></figure><p pid="52" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<br style="box-sizing: border-box;"></p>
<p pid="53" style="box-sizing: border-box; margin-top: 5px; margin-bottom: 15px; padding-top: 0px; color: rgb(34, 38, 53); font-family: Cambria, serif; font-size: 19px; background-color: rgb(255, 255, 255);">
<span class="notranslate" style="box-sizing: border-box;">Harap ini membantu!</span> <span class="notranslate" style="box-sizing: border-box;">Selamat coding.</span></p>
<p>
.</p>
<p>
<br></p>
<p>
.</p>

Diterjemah dari sumber: https://dzone.com/articles/securing-a-web-with-spring-boot

No comments: