คำนำ
ชิโรเป็นกรอบการอนุญาต สำหรับการใช้งานเฉพาะคุณสามารถตรวจสอบเว็บไซต์อย่างเป็นทางการ http://shiro.apache.org/ มันให้การรับรองความถูกต้องของการอนุญาตที่สะดวกมากและฟังก์ชั่นการเข้าสู่ระบบ
ในฐานะที่เป็นเฟรมเวิร์กโอเพ่นซอร์ส Springboot จะต้องจัดทำฟังก์ชั่นที่รวมเข้ากับ Shiro!
Shiro เคยใช้ในการตรวจสอบโครงการมาก่อน มันถูกใช้บ่อยขึ้นในสปริง MVC และกำหนดค่าด้วย XML มันค่อนข้างง่ายและเป็นผู้ใหญ่ที่จะใช้ Shiro เพื่อควบคุมการอนุญาต ยิ่งกว่านั้นฉันได้ใส่เซสชั่นของชิโร่ไว้ใน MongoDB เสมอ นี่คือความสอดคล้องกับความตั้งใจในการออกแบบดั้งเดิมของ MongoDB ในโครงการแบบกระจาย MongoDB ยังใช้เป็นเลเยอร์กลางซึ่งใช้ในการแก้ปัญหาการซิงโครไนซ์เซสชันในสภาพแวดล้อมแบบกระจายได้อย่างง่ายดาย
ตั้งแต่ Springboot ได้รับการปล่อยตัวโครงการของฉันสามารถใช้ Springboot ได้และมันก็สะดวกมากในการใช้ Maven สำหรับการจัดการแบบรวมศูนย์ แม้ว่า Springboot ยังมีชุดของ Framework Security Security Spring Security แต่ก็ไม่ค่อยมีประโยชน์มากดังนั้นจึงยังสะดวกกว่าที่จะใช้ Shiro การรวม Springboot กับ Shiro นั้นง่ายกว่า Spring MVC อย่างน้อยก็ไม่มีการกำหนดค่า XML จำนวนมากซึ่งดูสดชื่นมากขึ้นดังนั้นเราจะเริ่มรวมตัวต่อไป
วิธีนี้มีดังนี้:
ขั้นตอนแรกคือการเพิ่มการพึ่งพาชิโรและมองโกใน Maven ก่อน เวอร์ชัน Shiro ที่ฉันใช้คือ
<Hiro.Version> 1.2.3 </Shiro.Version>
เพิ่มการพึ่งพา:
<การพึ่งพา> <roupId> org.apache.shiro </groupId> <ratifactid> Shiro-core </artifactid> <cersion> $ {Shiro.version} </เวอร์ชัน> </serverency> <Sersion> $ {Shiro.Version} </Sident> </การพึ่งพา> <การพึ่งพา> <roupId> org.apache.shiro </groupId> <ratifactid> Shiro-spring </artifactid> <persion> $ {shiro.version} <ArtIfactId> Shiro-Spring </artifactid> <sersion> $ {Shiro.Version} </Side> </การพึ่งพา> <การพึ่งพาอาศัย> <roupId> org.mongoDB </groupId> <RoupID> org.springframework.data </groupId> <ratifactid> Spring-Data-MongoDB </artifactid> <cersion> 1.7.0.release </version> </dercendency>จากนั้นกำหนดค่า mongoDB ใน application.xml หรือ yml
Spring.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongoDb.database = Shiro_info
หลังจากการกำหนดค่าเสร็จสมบูรณ์เราเริ่มเขียนรหัสการรับรองความถูกต้องของ Shiro อย่างเป็นทางการก่อนกำหนดขอบเขตการรับรองความถูกต้องเป็นครั้งแรกที่สืบทอดมาจาก AuthorizedRealm
Shirodbrealm ระดับสาธารณะขยายการอนุญาต realzealm { / *** การดำเนินการข้อมูลผู้ใช้* / Private SystemUserService SystemUserService; ShirodBrealm สาธารณะ () {} ShirodBrealm สาธารณะ (SystemUserService SystemUserservice) {this.SystemUserService = SystemUserService; } / *** ข้อมูลการอนุญาต* / @Override Protected AuthorizationInfo DogetauthorizationInfo (หลักการหลักการของ PrincipalCollection) {SimpleAdeAtorizationInfo ข้อมูล = (SimpleAdizationInfo) Shirokit.GetShiroSessionAttr ("Perms"); if (null! = info &&! collectionutils.isempty (info.getRoles ()) &&! collectedUtils.isEmpty (info.getStringPermissions ())) {ข้อมูลส่งคืน; } return null; } / *** ข้อมูลการรับรองความถูกต้อง* / การพิสูจน์ตัวตนที่ได้รับการป้องกัน info doGetauthenticationInfo (AuthenticationToken AuthCtoken) พ่น AuthenticationException {USERNAMEPASSWORDTOKEN TOKEN = (USERNAMEPASSWORDTOKEN) AuthCtoken; String username = token.getUserName (); ถ้า (ชื่อผู้ใช้! = null &&! "". เท่ากับ (ชื่อผู้ใช้)) {systemuser key = new SystemUser (); key.setLoginName (token.getUserName ()); key.setPassword (string.valueof (token.getPassword ())); SystemUser user = SystemUserService.login (คีย์); if (user! = null) {หัวเรื่อง usertemp = securityUtils.getSubject (); usertemp.getSession (). setAttribute ("userId", user.getId ()); usertemp.getSession (). setAttribute ("ชื่อผู้ใช้", user.getUserName ()); ส่งคืน SimpleAuthEnticationInfo ใหม่ (user.getLoginName (), user.getPassword (), getName ()); }} return null; -จัดเก็บเซสชันในที่เก็บและการใช้งานของ MongoDB:
ส่วนต่อประสานสาธารณะ shiroSessionRepository { / ** * * @param เซสชัน * / void savesession (เซสชันเซสชัน); -MongoDbsessionRepository.java
MongoDbsessionRepository ระดับสาธารณะใช้ shiroSessionRepository {mongotemplate ส่วนตัว mongotemplate; Public MongoDbsessionRepository () {} Public MongoDbsessionRepository (Mongotemplate Mongotemplate) {this.mongotemplate = mongotemplate; } @Override โมฆะสาธารณะ savesession (เซสชันเซสชัน) {ถ้า (เซสชัน == null || session.getId () == null) {return; } sessionbean bean = new SessionBean (); Bean.setKey (getSessionKey (session.getId ())); Bean.setValue (serializeutil.serialize (เซสชัน)); Bean.setPrincipal (NULL); Bean.sethost (Session.getHost ()); Bean.setStartTimestamp (session.getStartTimestamp ()); bean.setLastaccessTime (session.getLastaccessTime ()); bean.settimeouttime (getTimeOuttime (session.getStartTimeStamp (), session.getTimeout ())); Mongotemplate.insert (ถั่ว); -ShiroSessiondao.java
ShiroSessiondao ชั้นเรียนสาธารณะขยายบทคัดย่อ abstractsessiondao { / *** logger* / logger สุดท้ายคงที่ logger log = loggerFactory.getLogger (ShiroSessionDao.Class); / *** การจัดเก็บข้อมูลฐานข้อมูล*/ ShiroSessionRepository ShiroSessionRepository ส่วนตัว; / ** * @return */ public shiroSessionRepository getShiroSessionRepository () {return shiroSessionRepository; } / ** * * @param shiroSessionRepository * / โมฆะสาธารณะ setshiroSessionRepository (shiroSessionRepository shiroSessionRepository) {this.ShiroSessionRepository = shiroSessionRepository; } @Override การอัปเดตโมฆะสาธารณะ (เซสชันเซสชัน) โยน UnknownSessionException {getShiroSessionRepository (). การอัปเดต (เซสชัน); } @Override โมฆะสาธารณะลบ (เซสชันเซสชัน) {if (เซสชัน == null) {log.error ("เซสชันไม่สามารถเป็นโมฆะลบล้มเหลว"); กลับ; } serializable id = session.getId (); if (id! = null) {getShiroSessionRepository (). deleTesession (id); }} @Override Collection <Session> GetActivesessions () {return getShiroSessionRepository (). getAllSessions (); } @Override ป้องกัน serializable docreate (เซสชันเซสชัน) {serializable sessionId = this.generatesessionId (เซสชัน); this.assignsessionId (เซสชัน, เซสชัน); getShiroSessionRepository (). savesession (เซสชัน); กลับ sessionId; } @Override เซสชันที่ได้รับการป้องกัน doreadsession (serializable sessionId) {return getShiroSessionRepository (). getSession (sessionId); -ตกลง! คลาสพื้นฐานทั้งหมดเสร็จสมบูรณ์และในที่สุดก็เขียน config เพื่อเริ่มต้นและกำหนดค่า Shiro
@ConfigurationPublic คลาส shiroconfig {@resource mongotemplate ส่วนตัว mongotemplate; @Resource Private SystemUserService SystemUsERService; // นี่คือบริการที่ใช้ในการกำหนดชื่อผู้ใช้และรหัสผ่าน @Bean สาธารณะ ShirofilterFactoryBean Shirofilter (DefaultWebsecurityManager SecurityManager) ShirofilterFactoryBean.SetSecurityManager (SecurityManager); ShirofilterFactoryBean.setLoginurl ("/เข้าสู่ระบบ"); shirofilterfactorybean.setsuccessurl ("/index"); ShirofilterFactoryBean.setunauthorizedUrl ("/403"); // interceptor แผนที่ <string, string> filterChainDefinitionMap = ใหม่ linkedHashMap <สตริง, สตริง> (); FilterChainDefinitionMap.put ("/คงที่/**", "anon"); FilterChainDefinitionMap.put ("/ajaxlogin", "anon"); FilterChainDefinitionMap.put ("/libs/**", "anon"); FilterChainDefinitionMap.put ("/images/**", "anon"); FilterChainDefinitionMap.put ("/logout", "logout"); FilterChainDefinitionMap.put ("/**", "Authc"); ShirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); ส่งคืน ShirofilterFactoryBean; } Public AuthorizationAttributesourceAdVisor AuthorizationAtTributesourceAdVisor (DefaultWebSessionManager SecurityManager) {AuthorizationAtTributesourceAdVisor Adv = ใหม่การอนุญาตใหม่ Adv.SetSecurityManager (SecurityManager); return adv; } @Bean Public DefaultWebsecurityManager SecurityManager (DefaultWebSessionManager SessionManager, ShirodBrealm MyShirorealm) {DefaultWebsecurityManager SecurityManager = ใหม่ defaultWebsecurityManager (); // ตั้งค่าอาณาจักร SecurityManager.setRealm (MyShiroRealm); SecurityManager.SetsessionManager (SessionManager); Return SecurityManager; } /*** Realm การรับรองความถูกต้อง; (ที่นี่ Pass SystemUserService ไปยังการเริ่มต้น ShirodBrealm ที่กำหนดเอง) * * @return */ @Bean ShirodBrealm MyShiRoRealym () {ShirodBrealm MyshiROREALM = ใหม่ ShirodBrealm (SystemUserservice); กลับ myshirorealm; } @Bean Public DefaultWebSessionAger SessionManager (ShiroSessionDao ShiroSessionDao) {DefaultWebSessionManager SessionManager = ใหม่ defaultWebSessionManager (); SessionManager.SetGlobalsessionTimeout (1800000L); SessionManager.setDeleteInvalidSessions (จริง); SessionManager.SetsessionValidationsChedulerenabled (จริง); SessionManager.setsessiondao (ShiroSessiondao); SessionManager.setsessionidcookieenabled (จริง); SimpleCookie Cookie = New SimpleCookie (Shirohttpsession.default_session_id_name); Cookie.sethttponly (จริง); COOKIE.SETMAXAGE (1800000); SessionManager.setsessionidcookie (คุกกี้); return SessionManager; } @Bean สาธารณะ ShiroSessiondao ShiroSessiondao (MongoDbsessionrepository ShiroSessionRepository) {ShiroSessiondao Dao = ใหม่ ShiroSessiondao (); Dao.SetShirosessionRepository (ShiroSessionRepository); กลับ Dao; } @Bean MongoDbsessionRepository ShiroSessionRepository () {MongoDbsessionRepository resp = mongoDbsessionRepository (mongotemplate); Resp Resp; -งานเสร็จแล้ว นี่เป็นเพียงการกำหนดค่าที่ง่าย รหัสได้รับการตัดตอนมาและแก้ไขจากโครงการ สำหรับวิธีการใช้งานในคอนโทรลเลอร์และวิธีการตรวจสอบสิทธิ์ด้วยสิทธิ์ที่แตกต่างกันมันเพียงพอที่จะนำไปใช้ในรหัสของคุณเอง
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com