Kata pengantar
Shiro adalah kerangka izin. Untuk penggunaan khusus, Anda dapat memeriksa situs web resminya http://shiro.apache.org/. Ini memberikan fungsi otentikasi dan login yang sangat nyaman.
Sebagai kerangka kerja open source, Springboot harus menyediakan fungsi yang terintegrasi dengan Shiro!
Shiro telah digunakan dalam otentikasi proyek sebelumnya. Ini digunakan lebih sering di Spring MVC, dan dikonfigurasi dengan XML. Relatif sederhana dan matang untuk menggunakan Shiro untuk kontrol izin. Selain itu, saya selalu menempatkan sesi Shiro di Mongodb. Ini lebih sesuai dengan niat desain asli MongoDB. Dalam proyek terdistribusi, MongoDB juga digunakan sebagai lapisan menengah, yang digunakan untuk dengan mudah menyelesaikan masalah sinkronisasi sesi di lingkungan terdistribusi.
Sejak Springboot dirilis, proyek saya pada dasarnya dapat menggunakan Springboot, dan juga sangat nyaman untuk menggunakan Maven untuk manajemen terpusat terpusat. Meskipun Springboot juga menyediakan satu set kerangka keamanan izin keamanan musim semi, relatif tidak terlalu berguna, sehingga masih lebih nyaman untuk menggunakan Shiro. Integrasi Springboot dengan Shiro jauh lebih sederhana daripada Spring MVC, setidaknya tanpa banyak konfigurasi XML, yang terlihat lebih menyegarkan, jadi kami akan mulai mengintegrasikan berikutnya.
Metode ini adalah sebagai berikut:
Langkah pertama harus menambahkan dependensi Shiro dan Mongo di Maven terlebih dahulu. Versi Shiro yang saya gunakan adalah
<shiro.version> 1.2.3 </shiro.version>
Tambahkan dependensi:
<dependency> <GroupId> org.apache.shiro </groupid> <ArTifactId> shiro-core </stifactid> <version> $ {shiro.version} </version> </dependency> <ArtiFAcid> <Groupid> org.apache.shiro </groupid> <ArtiFacTID> Shiro-org.apache. <version> $ {shiro.version} </version> </dependency> <dependency> <groupid> org.apache.shiro </proupid> <ArtifactId> Shiro-SPRING </artifactid> <version> $ {Shiro.version} </version> </Dependency> <version> <version> <voupeid> </version./org <ArTifactId> Shiro-SPRING </artifactId> <version> $ {shiro.version} </version> </dependency> <dependency> <groupid> org.mongoDb </sroupid> <ArTifactId> Mongo-java-driving </artifactid> <version> 3.0.0.0 </Versi </Version> </Artifactid </Versi 3.0.0.0 </Versi </Versi> </Versi </Version> </ArtifactId </Versi 3.0.0.0 </Version> </Versi </Version> </Version> </Versi 3.0.0.0 <groupId> org.springframework.data </groupId> <ArTifactId> spring-data-mongoDb </stifactid> <version> 1.7.0.release </version> </dependency>Kemudian konfigurasikan mongoDB di application.xml atau yml
spring.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongodb.database = shiro_info
Setelah konfigurasi selesai, kami mulai secara resmi menulis kode otentikasi Shiro, pertama -tama menyesuaikan ranah otentikasi, warisan dari otorisasi racun
kelas publik shirodbrealm memperluas otorisasiRealm { / *** Operasi Informasi Pengguna* / Private SystemUserService SystemUserService; public shirodbrealm () {} public shirodbrealm (SystemUserService SystemUserService) {this.systemuserservice = SystemUserService; } / *** Informasi otorisasi* / @Override Otorisasi yang Dilindungi di DoGetauthorizationInfo (PrincipalCollection Principals) {SimpleAuthorizationInfo Info = (SimpleAuthorizationInfo) shirokit.getshirosessionattr ("perms"); if (null! = info &&! collectionutils.isempty (info.getRoles ()) &&! collectionutils.isempty (info.getStringPerMissions ())) {return info; } return null; } / *** Informasi otentikasi* / AuthenticationInfo doGetAuthenticationInfo (authenticationToken authctoken) melempar authenticationException {UsernamepasswordToken token = (UsernamepasswordToken) authCtoken; String username = token.getUserName (); if (username! = null &&! "". Equals (username)) {SystemUser key = new SystemUser (); key.setLoginName (token.getusername ()); key.setPassword (string.ValueOf (token.getPassword ())); SystemUser User = SystemUserService.login (Key); if (user! = null) {subjek userTemp = securityutils.getsubject (); userTemp.getSession (). setAttribute ("userid", user.getId ()); userTemp.getSession (). setAttribute ("username", user.getusername ()); return new SimpleAuthenticationInfo (user.getLoginName (), user.getPassword (), getName ()); }} return null; }}Simpan sesi ke dalam repositori dan implementasi MongoDB:
antarmuka publik shiroSessionRepository { / ** * * @param sesi * / void savesession (sesi sesi); ......}MongodbsessionRepository.java
kelas publik MongoDbsessionRepository mengimplementasikan shirosessionrepository {private mongotemplate mongotemplate; public mongodbsessionrepository () {} public mongoDbsessionrepository (mongoTemplate mongotemplate) {this.mongotemplate = mongoTemplate; } @Override public void saveSession (sesi sesi) {if (session == null || session.getId () == null) {return; } Sessionbean bean = new sessionBean (); bean.setkey (getsession (session.getid ())); bean.setValue (serializeutil.serialize (sesi)); bean.setprincipal (null); bean.sethost (session.gethost ()); bean.setStartTimestamp (session.getStartTimestamp ()); bean.setLastAccessTime (session.getLastAccessTime ()); bean.setTimeoutTime (getTimeoutTime (session.getStartTimestamp (), session.getTimeout ())); mongotemplate.insert (bean); } ......}Shirosessiondao.java
kelas publik ShiroSessiondao memperluas abstractSessiondao { / *** logger* / private static final logger log = loggerFactory.getLogger (shirosessiondao.class); / *** Penyimpanan Basis Data*/ Private ShirosessionRepository ShirosessionRepository; / ** * @return */ public shirosessionRepository getshirosessionrepository () {return shiroSessionRepository; } / ** * * @param shirosessionrepository * / public void setshirosessionrepository (shirosessionrepository shirosessionrepository) {this.shirosessionRepository = shirosessionRepository; } @Override public void update (sesi sesi) melempar UnknownsessionException {getshiroSessionRepository (). UpdateSession (sesi); } @Override public void delete (sesi sesi) {if (session == null) {log.error ("sesi tidak bisa nol, hapus gagal"); kembali; } Serializable id = session.getId (); if (id! = null) {getshiroSessionRepository (). deletesession (id); }} @Override Public Collection <session> getActivesessions () {return getshiroSessionRepository (). GetAllSessions (); } @Override Dilindungi Dokreate Serializable (Sesi Sesi) {Serializable SessionID = this.generateSessionId (sesi); this.assignsessionId (session, sessionID); getshirosessionrepository (). savesession (sesi); return sessionID; } @Override Sesi DoreAdSession (Serializable SessionID) {return getshiroSessionRepository (). GetSession (sessionId); }}OKE! Semua kelas dasar telah selesai, dan akhirnya menulis konfigurasi untuk menginisialisasi dan mengkonfigurasi Shiro
@ConfigurationPublic kelas ShiroConfig {@resource private mongotemplate mongotemplate; @Resource Private SystemUserService SystemUserSerService; // Ini adalah layanan yang digunakan untuk menentukan nama pengguna dan kata sandi @Bean public shirofilterfactorybean shirofilter (defaultWebSecurityManagerManager) {shirofilterfactorybean (); shirofilterfactorybean.setsecurityManager (SecurityManager); shirofilterfactorybean.setloginurl ("/login"); shirofilterfactorybean.setsuccessurl ("/index"); shirofilterfactorybean.setunauthorizedUrl ("/403"); // Interceptor. Peta <String, String> FilterChainDefinitionMap = new LinkedHashMap <String, String> (); filterChainDefinitionMap.put ("/static/**", "anon"); filterChainDefinitionMap.put ("/ajaxlogin", "anon"); filterChainDefinitionMap.put ("/libs/**", "anon"); filterChainDefinitionMap.put ("/Images/**", "anon"); filterChainDefinitionMap.put ("/logout", "logout"); filterChainDefinitionMap.put ("/**", "authc"); shirofilterfactorybean.setfilterchaindefinitionMap (filterchainDefinitionMap); kembalikan shirofilterfactorybean; } Otorisasi PublikTributSourCeadVisor OtorisasiTattributeSourCeadVisor (DefaultWebSessionManager SecurityManager) {OtorationAttributSourCeadVisor ADV = Otorisasi baruTributSourCeadVisor (); ADV.SetSecurityManager (SecurityManager); Return Adv; } @Bean DefaultWebSecurityManager SecurityManager (DefaultWebSessionManager SessionManager, ShiroDbrealm myshiroreAlm) {DefaultWebSecurityManager SecurityManager = New DefaultWebSecurityManager (); // Atur Realm. SecurityManager.setrealm (myshirorealm); SecurityManager.SetSessionManager (SesiesManager); Return SecurityManager; } /*** ranah otentikasi; (Di sini lulus SystemUserService ke inisialisasi shirodbrealm khusus) * * @return */ @bean public shirodbrealm myshirorealm () {shirodbrealm myshirorealm = shirodbrealm baru (SystemUserService); kembalikan myshirorealm; } @Bean DefaultWebSessionManager sessionManager (shirosessiondao shirosessiondao) {defaultWebSessionManager sessionManager = New DefaultWebSessionManager (); sessionManager.setglobalsessionTimeout (1800000L); sessionManager.setDeleteInvalidSessions (true); sessionManager.setsessionValidationsChedulerenabled (true); sessionManager.setsessiondao (shirosessiondao); sessionManager.setsessionidcookieenabled (true); SimpleCookie cookie = SimpleCookie baru (shirohttpsession.default_session_id_name); cookie.sethttponly (true); cookie.setmaxage (1800000); sessionManager.setsessionidcookie (cookie); Return SessionManager; } @Bean public shirosessiondao shirosessiondao (mongodbsessionrepository shirosessionrepository) {shirosessiondao dao = new shirosessiondao (); dao.setshirosessionRepository (shirosessionRepository); mengembalikan dao; } @Bean MongoDBsessionRepository ShirosessionRepository () {MongoDBSessionRepository resp = mongoDbsessionRepository baru (mongotemplate); resp kembali; }}Tugas selesai. Ini hanya konfigurasi sederhana. Kode telah dikutip dan dimodifikasi dari proyek. Adapun cara menggunakannya di pengontrol dan cara mengotentikasi dengan izin yang berbeda, itu cukup untuk mengimplementasikannya dalam kode Anda sendiri.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.