Shiro
Apache Shiro adalah kerangka otentikasi dan otorisasi yang ringan. Dibandingkan dengan keamanan musim semi, sederhana dan mudah digunakan dan memiliki fleksibilitas tinggi. Lagipula, Springboot sendiri memberikan dukungan untuk keamanan, itu adalah miliknya sendiri. Springboot tidak mengintegrasikan Shiro untuk saat ini, jadi Anda harus mencocokkannya sendiri.
1. Tambahkan dependensi
<dependency> <GroupId> org.apache.shiro </groupid> <ArtifactId> Shiro-SPRING </artifactid> <version> 1.2.5 </version> </dependency> <sependency> <roupid> org.apache.shiro </sroupid> <ArTifacTID> versi <t ArtifacTid> <ArtiFacTID> <TROPERICED> <ArTIFACTID> Shiro-ehcache </artacache.
2. Tulis kelas konfigurasi shiro
paket com.xbz.web.system.config; impor at.pollux.thymeleaf.shiro.dialect.shirodialect; impor org.apache.shiro.authc.credential.credentialscatcher; impor org.apache.shiro.authc.credential.hashedcredentialsmatcher; impor org.apache.shiro.cache.ehcache.ehcachemanager; impor org.apache.shiro.codec.base64; impor org.apache.shiro.Session.SessionListener; impor org.apache.shiro.Session.mgt.SessionManager; impor org.apache.shiro.session.mgt.eis.memorysessiondao; impor org.apache.shiro.Session.mgt.eis.Sessiondao; impor org.apache.shiro.spring.lifecycleBeanPostProcessor; impor org.apache.shiro.spring.security.interceptor.authorizationAttributeSourceadVisor; impor org.apache.shiro.spring.web.shirofilterfactorybean; impor org.apache.shiro.web.mgt.cookieremembermemanager; impor org.apache.shiro.web.mgt.defaultwebsecurityManager; impor org.apache.shiro.web.servlet.simpleCookie; impor org.apache.shiro.web.session.mgt.defaultwebsessionManager; impor org.springframework.aop.framework.autoproxy.defaultAdvisorAutoproxyCreator; impor org.springframework.boot.autoconfigure.condition.condition.conditionalonmissingbean; impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.configuration; impor org.springframework.context.annotation.dependson; impor java.util.arraylist; impor java.util.collection; impor java.util.linkedhashmap; impor java.util.map; /*** Kelas Konfigurasi Shiro* Apacheshiro Inti mengimplementasikan kontrol izin dan intersepsi melalui filter, seperti SpringMVC menggunakan dispachservlet untuk mengontrol distribusi permintaan. * Karena menggunakan filter, yaitu, penyaringan dan verifikasi izin melalui aturan URL, kita perlu mendefinisikan serangkaian aturan dan mengakses hak tentang URL* / @Configuration Public Class ShiroConfiguration { / *** defaultAdvisorAutoproxycreator, kacang musim semi, dan penasihat memutuskan kelas -kelas yang menjadi kelas untuk aop. */ @Bean @ConditionAlonMissingBean DefaultAdvisorAutOproxyCreator DefaultAdvisorAutOproxyCreator () {defaultAdvisorAutoproxyCreator defaultaap = DefaultAdvisorAutoproxyCreator baru (); DefaultAap.SetProxyTargetClass (true); Return Defaultaap; } /*** shirofilterfactorybean: Untuk menghasilkan shirofilter, menangani file sumber daya yang mencegat. * Ini terutama memelihara tiga item data, SecurityManager, filter, filterChainDefinitionManager. * CATATAN: Konfigurasi ShirofilterFactoryBean tunggal adalah atau melaporkan kesalahan, karena ketika menginisialisasi shirofilterfactorybean, perlu untuk menyuntikkan: SecurityManager * * Deskripsi Definisi Filter * 1. Peran * */ @Bean Publik Shirofilterfactorybean ShirofilterfactoryBean () {Shirofilterfactorybean ShirofilterfactoryBean = ShirofilterFactoryBean () baru; shirofilterfactorybean.setsecurityManager (SecurityManager ()); shirofilterfactorybean.setloginurl ("/login"); // Jangan atur halaman login.jsp di bawah direktori root proyek web shirofilterfactorybean.setsuccessurl ("/index"); // Koneksi untuk melompat setelah login berhasil shirofilterfactoryBean.setun (oPoRaUr, "level (level (level (" oxhorized (level ("uchorized (" uchorized ("oxhorized (" Jump/* // Interceptor Kustom, Pengaturan untuk beberapa filter* // Peta <String, Filter> Filter = new LinkedHashMap <> (); // LOGOUTFILTER LOGOUTFILTER = LOGOUTFILTER BARU (); // Batasi jumlah nomor online dari akun yang sama secara bersamaan. atau masuk tunggal, dll. // LOGOUTFILTER.SETREDIRECTURL ("/LOGIN"); // filter.put ("logout", null); // shirofilterfactorybean.setfilters (filter); Peta <String, String> FilterChainDefinitionMap = new LinkedHashMap <> (); // FilterChainDefinitionManager harus berupa LinkedHashMap karena harus memastikan filterChainDefinitionMap.put ("/css/**", "anon"); // Sumber daya statis tidak memerlukan izin, jika ada file di direktori lain (seperti JS, IMG, dll.) Dan filterChainDefinitionMap.put ("/", "anon"); filterChainDefinitionMap.put ("/login", "anon"); // Konfigurasikan bagian URL FilterChainDefinitionMap.put ("/Logout", "Logout"); filterChainDefinitionMap.put ("/user/**", "authc, peran [role_user]"); // Pengguna adalah peran Role_user untuk diakses. Peran pengguna mengontrol perilaku pengguna. filterChainDefinitionMap.put ("/events/**", "authc, peran [role_admin]"); // filterChaindefinitionMap.put ("/user/edit/**", "authc, perms [pengguna: edit]"); // Untuk pengujian, nilai mati diperbaiki, dan juga dapat dibaca dari database atau konfigurasi lainnya. Di sini, izin digunakan untuk mengontrol filterChainDefinitionMap.put ("/**", "authc"); // sumber daya yang perlu masuk, umumnya ditempatkan /** di bagian bawah shirofilterfactorybean.setFilterChainDefinitionMap (filterChainDefinitionMap); kembalikan shirofilterfactorybean; } // cookie dan sesi wilayah // ============================ Manajemen Cookie dan Sesi Mulai ========================= Private Private Static Final String Cookie_name = "Rememberme"; /** Manajemen Objek Cookie*/Public Simplecookie RememberMecookie () {// Parameter ini adalah nama cookie, sesuai dengan nama kotak centang di ujung depan = Rememberme SimpleCookie SimpleCookie = SimpleCookie baru (cookie_name); SimpleCookie.setmaxage (604800); // Ingat cookie saya mulai berlaku selama 7 hari, dan unit dikembalikan Simplecookie; } / ** Objek Manajemen Cookie: Ingat saya fungsi* / cookieremembermemanager RememberMeManager () {cookieremembermemanager cookieremembermemanager = cookieremembermemanager baru (); cookieremembermemanager.setcookie (RememberMecookie ()); cookieremembermemanager.setCipherKey (base64.decode ("3avvhmflus0kta3kprsdag ==")); // Rememberme Cookie Encryption Key menunjukkan bahwa setiap item berbeda dari Algoritma Kunci Algoritma (128 256 512 BIT) Kembali Cookierememanager; } @Bean sessiondao sessiondao () {return new memoresessiondao (); } @Bean Public SesiesManager sessionManager () {DefaultWebSessionManager sessionManager = New DefaultWebSessionManager (); Koleksi <SessionListener> pendengar = new ArrayList <> (); pendengar.add (bdsessionlistener ()); sessionManager.setsessionListeners (pendengar); sessionManager.setsessiondao (sessiondao ()); Return SessionManager; } // ======================= Cookies dan manajemen sesi akhir ======================= /endregion /*** SecurityManager: Core Security Transaction Manager, Manajemen Izin* Kelas ini menggabungkan login, logout, izin, dan proses sesi. Ini adalah kelas yang relatif penting. */ @Bean (name = "SecurityManager") Public DefaultWebSecurityManager SecurityManager () {DefaultWebSecurityManager SecurityManager = New DefaultWebSecurityManager (); SecurityManager.setrealm (shirorealm ()); SecurityManager.setCacheManager (ehcachemanager ()); ///// Otorisasi Pengguna/Informasi Otentikasi Cache, menggunakan EHCache Cache // Manajemen Sesi Kustom menggunakan Redis SecurityManager.setsessionManager (sessionManager ()); // suntikan ingat manajer saya; SecurityManager.setremembermemanager (RememberMeManager ()); Return SecurityManager; } /** * Shirorealm, ini adalah kelas otentikasi khusus, diwarisi dari otorisasiRealm, * yang bertanggung jawab atas otentikasi pengguna dan pemrosesan izin, Anda dapat merujuk pada implementasi JDBCrealm. */ @Bean @dependson ("LifeCycleBeanPostProcessor") Publik Shirorealm ShiroreAlm (CredentialSmatcher Matcher) {ShiroreAlm realm = new ShiroreAlm (); realm.setCredentialSmatcher (pencocokan); // Verifikasi kata sandi mengimplementasikan ranah pengembalian; } /*** Ehcachemanager, CacheManager* Setelah pengguna masuk dengan sukses, menyimpan informasi pengguna dan informasi izin, dan kemudian setiap kali pengguna meminta, masukkan ke dalam sesi pengguna. Jika kacang ini tidak diatur, database akan ditanyai sekali untuk setiap permintaan. */ @Bean @dependson ("LifeCycleBeanPostProcessor") Publik Ehcachemanager ehcachemanager () {ehcachemanager em = ehcachemanager baru (); em.setCachemanAgerConfigFile ("classpath: config/ehcache.xml"); // konfigurasi path file return em; } /** * LifeCycleBeanPostProcessor, ini adalah subkelas dari DestructionAwarebeanPostProcessor, * bertanggung jawab atas siklus hidup org.apache.shiro.util.initializable tipe bean. * Terutama subkelas dari kelas otorisasi, serta kelas Ehcachemanager. */ @Bean (name = "LifeCycleBeanPostProcessor") Publik LifeCycleBeanPostProcessor LifeCycleBeanPostProcessor () {return LifeCycleBeanPostProcessor () baru; } /** * HashedCredentialScatcher, kelas ini untuk menyandikan kata sandi, * mencegah kata sandi disimpan dalam database dengan jelas. Of course, when logging in to authentication, * This class is also responsible for encoding the passwords entered in the form* Processing authentication matching processor: If customization requires the inheritance of HashedCredentialsMatcher */ @Bean(name = "hashedCredentialsMatcher") public HashedCredentialsMatcher hashedCredentialsMatcher() { HashedCredentialsMatcher credentialsMatcher = hashedcredentialscatcher baru (); credentialsmatcher.sethashalgorithMname ("md5"); // Tentukan metode enkripsi, dan Anda juga dapat menambahkan cache di sini. Ketika pengguna masuk lebih dari lima kesalahan login, pengguna terkunci. Pengguna dilarang terus -menerus mencoba masuk kredensialsmatcher.sethashiterations (2); kredensialsmatcher.sorstoredCredentialShexencoded (true); mengembalikan kredensialsmatcher; } /** * OtorisasiTributeSourceadVisor, kelas penasihat yang diimplementasikan di Shiro, * Gunakan aopallianceannotationsAuthorizingMethodInterceptor secara internal untuk mencegat metode dengan anotasi berikut. */ @Bean Otorisasi PublikTributSourceadVisor OtorisasiArtributSourCeadVisor () {OtorisasiAttributSourCeadVisor Advisor = Otorisasi baruTributSourCeadVisor (); Advisor.SetsecurityManager (SecurityManager ()); penasihat kembali; } // @bean public shirodialect shirodialect () {return new shirodialect (); }} 3. Kustomisasi kelas verifikasi ranah
paket com.yiyun.web.system.config; impor com.yiyun.dao.master.userdao; impor com.yiyun.domain.userbo; impor com.yiyun.web.common.utils.shiroutils; impor com.yiyun.web.system.service.menuservice; impor org.apache.shiro.securityutils; impor org.apache.shiro.authc.*; impor org.apache.shiro.authz.authorizationInfo; impor org.apache.shiro.authz.simpleauthorizationInfo; impor org.apache.shiro.realm.AuthorizingRealm; impor org.apache.shiro.Session.Session; impor org.apache.shiro.subject.principalcollection; impor org.springframework.beans.factory.annotation.Autowired; impor java.util.*; / *** Dapatkan Informasi Peran dan Izin Pengguna*/ Kelas Publik ShiroreAlm memperluas otorisasiRealm {// Umumnya, apa yang ditulis di sini adalah servic @Autowired private userdao userMapper; @Autowired Private MenuService MenuService; /*** Otentikasi login secara umum, setelah masuk, pengguna saat ini diberikan izin. Langkah ini didasarkan pada doGetAuthenticationInfo. Hanya setelah informasi pengguna, Anda dapat menentukan apakah akan mengotorisasi pengguna berdasarkan peran dan informasi otorisasi pengguna. Therefore, Roles and Permissions here are the two key judgment basis for the user* @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; Userdo user = usermapper.findbyname (token.getUserName ()); // Periksa apakah ada pengguna ini jika (pengguna! = Null) {// Jika ada, simpan pengguna ini dalam info otentikasi login, dan tidak perlu membandingkan kata sandi sendiri. Shiro akan melakukan perbandingan dan verifikasi kata sandi untuk daftar AS <rerole> rlist = uroledao.findroleByuid (user.getId ()); // Dapatkan daftar peran pengguna <upermission> plist = upermissionDao. Daftar <String> permissionstrList = ArrayList baru <string> (); /// Koleksi izin pengguna untuk (Peran urol: rList) {rolestrlist.add (role.getName ()); } untuk (upermission upermission: plist) {perminsstrlist.add (upermission.getName ()); } user.setrolestrlist (rolestrlist); user.setperminsstrlist (perminsstrlist); Sesi sesi = SecurityUtils.getSubject (). GetSession (); session.setAttribute ("user", user); // Jika berhasil, letakkan di sesi // jika ada, simpan pengguna ini dalam info otentikasi login, dan Anda tidak perlu membandingkan kata sandi Anda sendiri. Shiro akan melakukan verifikasi perbandingan kata sandi untuk kami. Return new SimpleAuthenticationInfo (user, user.getPassword (), getName ()); } return null; } / *** Otentikasi Izin* Dapatkan informasi izin pengguna, yaitu membuat penilaian untuk langkah otorisasi berikutnya, untuk mendapatkan peran pengguna saat ini dan informasi izin yang dimiliki oleh peran ini* @param principalcollection* @return* @Override yang dilindungi), prinsip -namanya di atas, prinsip, prinsip, prinsip @retalcollection (prinsip @Override, in -@override, inciNoChorizationInzeIzationInzeIzation (prinsipalcollection @Override di @Override) setara dengan (string) principalcollection.fromrealm (getName ()). iterator (). next (); // String LoginName = (String) Super.getaVailablePrincipal (principalCollection); Userdo user = (userdo) principalcollection.getPrimaryPrincipal (); // // Pergi ke database untuk memeriksa apakah objek ini hadir // pengguna pengguna = null; // Dalam proyek aktual, Anda dapat cache sesuai dengan situasi aktual. Jika tidak, Shiro sendiri memiliki mekanisme interval waktu dan tidak akan menjalankan metode berulang kali dalam 2 menit // user = usermapper.findbyname (LoginName); if (user! = null) {// Informasi Informasi Izin Info Objek, digunakan untuk menyimpan semua peran (peran) dan izin (izin) dari pengguna yang ditemukan SimpleAuthorizationInfo info = SimpleAuthorizationInfo baru (); // info koleksi peran pengguna (user.getrolestrlist ()); // info pengumpulan izin pengguna. pengembalian info; } // return null, itu akan menyebabkan pengguna mana pun mengakses permintaan yang dicegat untuk secara otomatis melompat ke alamat yang ditentukan oleh UnrorizedUrl; }}4. Akhirnya, lihatlah file konfigurasi Ehcache
<? Xml Version = "1.0" encoding = "UTF-8"?> <Ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespaceschalocation = "http:/eHcache.org =" nonamespaceschalocation = "http:/ehcache.org.org =" http:/ehcache.org.org = "http:/ehcache.org <diskstore path = "java.io.tmpdir /tmp_ehcache" /> <!- Nama: nama cache. MaxElementsInmemory: Jumlah maksimum cache MaxElementsondisk: Jumlah maksimum cache untuk hard disk. Eternal: Apakah objek itu valid secara permanen, setelah ditetapkan, batas waktu tidak akan berfungsi. OverflowTodisk: Apakah akan menyimpan ke disk, TimeToidleseconds: Mengatur waktu idle yang diizinkan (unit: detik) dari objek sebelum kedaluwarsa. Hanya digunakan jika objek abadi = false tidak valid secara permanen, atribut opsional, nilai default adalah 0, yang berarti waktu idle tidak terbatas. TimeToliveseconds: Mengatur waktu (unit: detik) dari objek sebelum kedaluwarsa. Waktu maksimum adalah antara waktu penciptaan dan waktu kegagalan. Hanya digunakan jika objek abadi = false tidak valid secara permanen, standarnya adalah 0., yang berarti bahwa waktu kelangsungan hidup objek tidak terbatas. Diskpersistent: Apakah toko disk tetap ada di antara restart mesin virtual. Nilai defaultnya salah. DISKSPOOLBUFFERSIZEM: Parameter ini menetapkan ukuran cache dari Diskstore (Disk Cache). Standarnya adalah 30MB. Setiap cache harus memiliki buffer sendiri. DISKEXPIRYTHREADIVALCONDS: Interval waktu run utas kegagalan disk, standarnya adalah 120 detik. MemoryStoreEvictionPolicy: Ketika batas MaxElementsInmemory tercapai, Ehcache akan membersihkan memori sesuai dengan kebijakan yang ditentukan. Kebijakan default adalah LRU (yang paling baru digunakan). Anda dapat mengaturnya ke FIFO (pertama, pertama keluar) atau LFU (kurang digunakan). ClearOnflush: Apakah akan menghapus kapan jumlah memori maksimum. MemorysoreEvictionPolicy: tiga strategi kliring untuk EHCACHE; FIFO, pertama di First Out, ini adalah yang paling akrab bagi semua orang, pertama di First Out. LFU, lebih jarang digunakan, adalah strategi yang digunakan dalam contoh di atas. Menjadi tumpul, itu untuk mengatakan bahwa itu adalah yang paling tidak pernah digunakan. Seperti disebutkan di atas, elemen yang di -cache memiliki atribut hit, dan nilai hit terendah akan dihapus dari cache. LRU, paling tidak baru -baru ini digunakan, elemen cache memiliki cap waktu. Ketika kapasitas cache penuh dan Anda perlu memberi ruang untuk menyimpan elemen baru, elemen dengan waktu terjauh dalam elemen cache yang ada akan dihapus dari cache. -> <DefaultCache Eternal = "false" maxElementsInmemory = "1000" overflowTodisk = "false" diskpersistent = "false" timeToidleseconds = "0" timetoliveseconds = "600" memorystoreevictionPolicy = "lru" /<! <!-catatan latin " maxentrieslocalheap = "2000" abadi = "false" timeToidleseconds = "3600" timetoliveseconds = "0" overflowTodisk = "false" statistik = "true"> </cache> </ehcache> "false"
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.