Baru -baru ini, saya sedang mengerjakan proyek aplikasi. Saya mengembangkannya sendiri di latar belakang. Fungsi dasar login, pendaftaran dan verifikasi izin tidak termasuk dalam tahap pertama pengembangan dalam urutan tugas pengembangan. Sekarang beberapa fungsi terkait bisnis telah selesai, tetapi portal pengguna belum diimplementasikan. Ini hanya menunjukkan bahwa saya terlalu cemas ketika saya pertama kali menganalisis persyaratan dan meletakkan portal pengguna paling dasar.
Sekarang Anda perlu menambahkan login pengguna dan fungsi verifikasi izin berdasarkan kode yang ada.
Mengenai login dan verifikasi izin, merujuk pada pengalaman pengembangan iOS sebelumnya, sisi aplikasi memberikan nama pengguna dan kata sandi untuk menukar token, dan izin login diperlukan untuk setiap permintaan melalui token yang dipertukarkan.
Sekarang, di sisi lain, saya perlu mempertimbangkan masalah berikut:
1. Cara dengan mudah memenuhi implementasi fungsi -fungsi ini dalam kode fungsi yang ada, sehingga kode yang ada tidak banyak berubah, dan tidak akan ada kerumitan untuk menerapkan verifikasi izin di masa depan.
2. Cara Menghasilkan Token Berdasarkan Nama Pengguna dan Kata Sandi, dan Cara Membedakan Kebenaran Klien Menyediakan Token Dalam Fungsi yang Membutuhkan Izin
Pertama -tama, menghadapi masalah pertama, menurut pengalaman, solusi konvensional adalah filter dan pencegat. Jika login dan verifikasi izin ditempatkan dalam pengaturan persyaratan, selama URL dari fungsi selanjutnya diberikan pola tertentu, penggunaan filter atau pencegat akan berhasil. Tapi sekarang saya menghadapi URL yang tidak memiliki desain atau spesifikasi pada tahap awal, jadi saya tidak ingin menghadapi menggunakan filter atau pencegat.
Selain solusi konvensional di atas, Spring AOP telah menjadi senjata untuk menyelesaikan masalah jenis ini. Ia menggunakan pemrograman tatap muka untuk memberikan pra-notasi untuk semua metode yang memerlukan verifikasi izin. Namun, karena URL, nama kelas atau metode tidak teratur, saya memikirkan anotasi khusus dan memverifikasi izin untuk semua metode yang menambahkan anotasi khusus.
1. Karena Anda sudah berpikir untuk menggunakan Spring AOP, langkah pertama adalah mengaktifkan AOP di file konfigurasi pegas
// Buka AOP
<AOP: AspectJ-autoproxy />
Konfigurasi di atas didasarkan pada menuangkan paket toples terkait pegas-AOP ke dalam proyek, dan memperkenalkan URL AOP di header file konfigurasi.
2. Selanjutnya, mari kita tentukan anotasi khusus terlebih dahulu
@Target ({elementType.method, elementType.type}) @retensi (retentionpolicy.runtime) public @interface userAccess {}3. Kami tidak dapat terburu -buru melakukan fungsi verifikasi izin, karena token kami belum menghasilkan solusi.
Untuk generasi token, masuk tunggal dipertimbangkan, sehingga token tidak dapat diperbaiki sepanjang waktu. Jika tidak, kapan saja, selama Anda memiliki token, setidaknya dua orang dapat menggunakan akun yang sama pada saat yang sama, yang tidak diizinkan dalam bisnis kami saat ini. Pada akhirnya, saya memilih "Nama Pengguna + Kata Sandi + Waktu Login" untuk melakukan enkripsi MD5 sebagai token (ada banyak metode, seperti UUID ketika memastikan keunikan dan mutabilitas). Hasilkan token ketika nama pengguna dan kata sandi berhasil diverifikasi, dan menyimpan token dalam bentuk pasangan nilai kunci dari "nama pengguna: token" dan "token: pengguna" (juga dapat disimpan ke dalam database), dan akhirnya mengembalikan token ke klien.
Kode berikut hanyalah contoh sederhana:
@Servicepublic class LoginService {/*** Store "User name: token" key-value pair */public static Map<String,String> tokenMap=new HashMap<String,String>();/*** Store "token:User" key-value pair */public static Map<String,User> loginUserMap=new HashMap<String,User>(); Login string publik (nama string, kata sandi string) {System.out.println (Nama+"-----"+Kata Sandi);/*** Periksa apakah login berhasil* 1. Login berhasil* 1.1. Berhasil menghasilkan token yang sesuai dan perbarui * 1.2. Lempar pengecualian jika gagal*/string token = tokenMap.get (name); pengguna pengguna = null; if (token == null) {user = User baru (); user.setname (name); user.setpassword (kata sandi); System.out.println ("User baru); Login ");} else {user = LOGINUSERMAP.get (token); LOGINUSERMAP.REMOVE (token); System.out.println (" Perbarui Token Login Pengguna ");} Token = Md5Util.MD5 (Nama+Kata Sandi+Tanggal Baru (). Gettime ()); LOGINUMAPAP (NAME+NAME+Tanggal (). Gettime.); token); system.out.println ("saat ini"+tokenMap.size ()+"pengguna"); untuk (pengguna u: loginusermap.values ()) {System.out.println (u.getname ()+":"+u.getpassword ());} return token;}}}}4. Pada saat yang sama, klien kami telah memperoleh token setelah masuk. Selama kami membawa token dalam semua permintaan yang memerlukan izin, kami dapat berhasil mendapatkan respons (saran: untuk memfasilitasi pengkodean aplikasi, token dapat dilakukan di tajuk permintaan, dan kode yang ada tidak perlu menjadi perubahan besar, dan kami tidak perlu peduli dengan edisi yang harus diatasi. Saya baru saja menemukan metode untuk melakukan percobaan:
@Controller@requestMapping ("/Login") LogIncontroller kelas publik {@AutowiredPrivate LogInservice LogInservice; @UserAccess @RequestMapping (value = "/Loginin", Method = requestMethod.get) public @ResponseBody String Login (httpservletRequest request) {string name = request.getParameter ("name"); string password = request.getParameter ("kata sandi"); string token = loginservice.loge.log (name, name (name ("" string token;Perhatikan bahwa bagian tebal adalah untuk menyesuaikan anotasi. Tidak mungkin memiliki token untuk parameter permintaan fungsi login, jadi tidak peduli berapa kali diverifikasi, tidak dapat dilewati. Contoh saja. @UserAccess Tambahkan hanya berfungsi pada fungsionalitas yang memerlukan verifikasi izin
5. Anotasi khusus sekarang menjadi titik masuk yang baik
@Component@aspectpublic kelas izinaspect {// Tetapkan anotasi khusus sebagai titik masuk @before ("@annotation (com.example.chap01.annotation.userAccess)") public void checkPermission (joinpoint joinpoint) lemparan {System.out.println ("pra-notifikasi"); joinpoint.getArgs (); httpservletRequest request = (httpservletrequest) args [0]; string token = request.getParameter ("token"); System.out.println ("Token Pra-Notifikasi:"+Token); Pengguna); user = LogInservice.LoginUserMap.get (token); if (user == null) {System.out.println ("Verifikasi tidak dilewati!"); lempar pengecualian baru ("tidak ada izin");}}}}Pada titik ini, fungsi login dan verifikasi izin semuanya selesai.
Selain itu, kode sumber pada github pribadi dilampirkan: https://github.com/zw201913/applogin.git
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.