Keamanan ada di mana -mana. Saya memanfaatkan liburan untuk membaca dokumen Shiro dan mendokumentasikan integrasi boot musim semi Shiro untuk mengontrol hak akses berdasarkan peran dalam database
Perkenalan
Apache Shiro adalah kerangka keamanan keamanan open source yang kuat, fleksibel. Ini menangani otentikasi, otorisasi, manajemen sesi perusahaan dan enkripsi dengan bersih.
Gambar di atas menunjukkan arsitektur dasar Shiro
Otentikasi
Terkadang disebut "login" untuk membuktikan bahwa pengguna adalah pengguna itu sendiri
Otorisasi
Proses kontrol akses, yaitu, tentukan "siapa" mengakses "apa"
Manajemen Sesi
Kelola sesi khusus pengguna. Di Shiro, Anda dapat menemukan bahwa semua informasi sesi pengguna akan dikendalikan oleh Shiro.
Kriptografi (enkripsi)
Algoritma enkripsi pada sumber data sambil memastikan kemudahan penggunaan
Awal
lingkungan
Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Spring Data JPA Lombok
Tambahkan dependensi
Hanya dependensi Shiro utama yang diberikan di sini
<dependency> <GroupId> org.apache.shiro </groupid> <ArTifactId> shiro-spring-boot-starter </artifactid> <version> 1.4.0-rc2 </version> </dependency>
Konfigurasi
Kami hanya membutuhkan tabel pengguna dan tabel peran untuk saat ini. Memodifikasi file konfigurasi di boot spring akan secara otomatis membuat tabel database untuk kami
Server: Port: 8888Spring: DataSource: driver-class-name: com.mysql.jdbc.driver nama pengguna: root Password: root URL: jdbc: mysql: // localhost: 3306/shiro? karakterenCoding = utf-8 & usessl = false jpa: generate: generate: gener-debl: donor-debin: due-de-debin: due-de-auts: due-de-auSl-deperl: due-deperl: due-deperl: due-dext: due-dext: due-deperl: due-dext: due-n.
kesatuan
Peran.java
@Data @EntityPublic Class Role {@ID @id @GeneratedValue Private Integer ID; Userid panjang pribadi; Peran string pribadi;}User.java
@Data @entitypublic kelas pengguna {@id @id @generatedValue Private Long ID; nama pengguna string pribadi; kata sandi string pribadi;}Dunia
Pertama, buat kelas ranah, mewarisi dari otorisasiRealm, dan menyesuaikan metode otorisasi dan otentikasi kami sendiri. Realm adalah komponen yang dapat mengakses data keamanan khusus untuk aplikasi, seperti pengguna, peran, dan izin.
Realm.java
REALM KELAS PUBLIK MENGUMPUTI OUTHERIZEREALM {@Autowired Private UserServerService UserService; // otorize @Override dilindungi otorisasiinfo doGetAuthorizationInfo (principalcollection principalcollection) {// Dapatkan nama pengguna dari kredensial string username = (string) securityutils.getSubject (). GetPrincipal (); // Query Objek Pengguna Berdasarkan Pengguna Nama Pengguna = UserserVice.getUserByUserName (nama pengguna); // query Peran yang dimiliki oleh daftar pengguna <lance> list = roleservice.findbyUserId (user.getId ()); SimpleAuthorizationInfo Info = SimpleAuthorizationInnize baru (); untuk (peran peran: daftar) {// berikan info peran pengguna.addStringPerMission (role.getRole ()); } return info; } // otorisasi @Override AuthenticationIntInfo doGetAuthenticationInfo (authenticationToken authenticationToken) melempar authenticationException {// dapatkan nama pengguna dari pengguna pengguna saat ini = (string) authenticationToken.getPrincipal (); // menemukan pengguna dari pengguna database pengguna = userService.getUserByUserName (nama pengguna); if (UsserService.getUserbyUserName (username) == null) {throw new UnknownAccountException ("Informasi pengguna yang sesuai tidak ditemukan dalam sistem ini."); } SimpleAuthenticationInfo Info = new SimpleAuthenticationInfo (user.getUserName (), user.getPassword (), getName ()); pengembalian info; }}Kelas Konfigurasi Shiro
Shiroconfig.java
@ConfigurationPublic kelas ShiroConfig {@Bean Publik ShirofilterfactoryBean ShirofilterfactoryBean (SecurityManager SecurityManager) {shirofilterfactorybean ShirofilterfactoryBean = ShirofilterfactoryBean (); shirofilterfactorybean.setsecurityManager (SecurityManager); Peta <String, String> FilterChainDefinitionMap = new LinkedHashMap <String, String> (); // Berikut ini adalah rantai filter, penyaringan secara berurutan, jadi/** perlu menempatkan sumber daya statis terakhir // buka filterchaindefinitionmap.put ("/favicon.ico", "anon"); // Ikon Web FilterChainDefinitionMap.put ("/**", "authc"); shirofilterfactorybean.setfilterchaindefinitionMap (filterchainDefinitionMap); kembalikan shirofilterfactorybean; } @Bean DefaultWebSecurityManager SecurityManager () {DefaultWebSecurityManager DefaultWebSecurityManager = New DefaultWebSecurityManager (myRealM ()); return defaultWebSecurityManager; } @Bean public myrealm myrealm () {myrealm myrealm = new myrealm (); Kembalikan Myrealm; }}Pengontrol
Usercontroller.java
@ControllerPublic kelas UserController {@Autowired Private UserService UserService; @GetMapping ("/") public string index () {return "index"; } @GetMapping ("/Login") Public String TOGIN () {return "Login"; } @GetMapping ("/admin") public string admin () {return "admin"; } @PostMapping ("/Login") Public String Dologin (String UserName, String Password) {UserNamePasswordToken token = UserNamePasswordToken baru (nama pengguna, kata sandi); Subjek subjek = Securityutils.getSubject (); coba {subjek.login (token); } catch (Exception e) {E.PrintStackTrace (); } return "Redirect: Admin"; } @GetMapping ("/home") public string home () {subjek subjek = Securityutils.getSubject (); coba {subjek.CheckPerMisi ("admin"); } catch (Exception Exception Unkorized) {System.out.println ("Tidak ada izin yang cukup"); } return "home"; } @GetMapping ("/logout") public string logout () {return "index"; }}Melayani
Userservice.java
@ServicePublic kelas UserserService {@Autowired private userdao userdao; pengguna publik getUserByUserName (string username) {return userdao.findbyusername (nama pengguna); } @RequiresRoles ("admin") public void send () {System.out.println ("Saya sekarang memiliki admin peran, dan dapat menjalankan pernyataan ini"); }}Lapisan tampilan
admin.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "UTF-8"/> <title> Judul </title> </head> <Body> <Form Action "" /> <input type = "password" name = "password" /> <input type = "kirim" value = "login" /> </form> </body> </html>
home.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> </title> </head> </home/home/bodt> </bodt> </htl> </title>
index.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> judul </title> </head> </head log = "owell owell> </title </head> </head> <body> <bodef =" over over "owell" owell "noof owell> </title> </head> <body> <body> </href =" over "noF owell" over "noF owell> </head> </head> <body> <a href =" over "owell" over "owell" noF over "noF owell" di </a> </body> </html>
Login.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "UTF-8"/> <title> Judul </title> </head> <Body> <Form Action "" /> <input type = "password" name = "password" /> <input type = "kirim" value = "login" /> </form> </body> </html>
Meringkaskan
Kasing kecil ini mengimplementasikan kontrol akses pengguna berdasarkan peran, yang paling penting adalah ranah, yang bertindak sebagai "jembatan" atau "konektor" antara Shiro dan data keamanan aplikasi.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.