亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring Boot集成Shiro并利用MongoDB做Session存儲的方法詳解

2024-07-13 10:14:46
字體:
來源:轉載
供稿:網友

前言

shiro是一個權限框架,具體的使用可以查看其官網 http://shiro.apache.org/ 它提供了很方便的權限認證和登錄的功能.

而springboot作為一個開源框架,必然提供了和shiro整合的功能!

之前項目鑒權一直使用的Shiro,那是在Spring MVC里面使用的比較多,而且都是用XML來配置,用Shiro來做權限控制相對比較簡單而且成熟,而且我一直都把Shiro的session放在mongodb中,這個比較符合mongodb的設計初衷,而且在分布式項目中mongodb也作為一個中間層,用來很好很方便解決分布式環境下的session同步的問題

自從SpringBoot問世之后我的項目基本上能用SpringBoot的就會用SpringBoot,用MAVEN做統一集中管理也很方便,雖然SpringBoot也提供了一套權限安全框架Spring Security,但是相對來說還是不是太好用,所以還是用Shiro來的方便一點,SpringBoot集成Shiro要比Spring MVC要簡單的多,至少沒有一堆XML配置,看起來更清爽,那么接下來我們就開始集成。

方法如下:

第一步必然是在MAVEN中先添加Shiro和mongo的依賴,我用的Shiro版本是

<shiro.version>1.2.3</shiro.version>

添加依賴:

<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version></dependency><dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${shiro.version}</version></dependency><dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${shiro.version}</version></dependency><dependency> <groupId>org.mongodb</groupId>  <artifactId>mongo-java-driver</artifactId>  <version>3.0.0</version></dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.7.0.RELEASE</version></dependency>

然后在application.xml或yml中配置mongodb

spring.data.mongodb.host=127.0.0.1spring.data.mongodb.port=27017spring.data.mongodb.database=SHIRO_INFO

配置完成之后我們開始正式寫Shiro認證的代碼,先自定義一個鑒權realm,繼承自AuthorizingRealm

public class ShiroDbRealm extends AuthorizingRealm { /** * 用戶信息操作 */ private SystemUserService systemUserService; public ShiroDbRealm() {} public ShiroDbRealm(SystemUserService systemUserService) { this.systemUserService = systemUserService; } /** * 授權信息 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo info = (SimpleAuthorizationInfo) ShiroKit.getShiroSessionAttr("perms"); if (null != info && !CollectionUtils.isEmpty(info.getRoles())  && !CollectionUtils.isEmpty(info.getStringPermissions())) {  return info; } return null; } /** * 認證信息 */ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)  throws 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) {  Subject 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; }}

存儲session進mongodb的Repository和實現:

public interface ShiroSessionRepository { /** *  * @param session */ void saveSession(Session session); ......}

MongoDBSessionRepository.java

public class MongoDBSessionRepository implements ShiroSessionRepository { private MongoTemplate mongoTemplate; public MongoDBSessionRepository() {} public MongoDBSessionRepository(MongoTemplate mongoTemplate) {  this.mongoTemplate = mongoTemplate; } @Override public void saveSession(Session session) {  if (session == null || session.getId() == null) {  return;  }  SessionBean bean = new SessionBean();  bean.setKey(getSessionKey(session.getId()));  bean.setValue(SerializeUtil.serialize(session));  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

public class ShiroSessionDAO extends AbstractSessionDAO { /** * 日志記錄器 */ private static final Logger log = LoggerFactory.getLogger(ShiroSessionDAO.class); /** * 數據庫存儲 */ private ShiroSessionRepository shiroSessionRepository; /** *  * @return */ public ShiroSessionRepository getShiroSessionRepository() { return shiroSessionRepository; } /** *  * @param shiroSessionRepository */ public void setShiroSessionRepository(ShiroSessionRepository shiroSessionRepository) { this.shiroSessionRepository = shiroSessionRepository; } @Override public void update(Session session) throws UnknownSessionException { getShiroSessionRepository().updateSession(session); } @Override public void delete(Session session) { if (session == null) {  log.error("session can not be null,delete failed");  return; } Serializable id = session.getId(); if (id != null) {  getShiroSessionRepository().deleteSession(id); } } @Override public Collection<Session> getActiveSessions() { return getShiroSessionRepository().getAllSessions(); } @Override protected Serializable doCreate(Session session) { Serializable sessionId = this.generateSessionId(session); this.assignSessionId(session, sessionId); getShiroSessionRepository().saveSession(session); return sessionId; } @Override protected Session doReadSession(Serializable sessionId) { return getShiroSessionRepository().getSession(sessionId); }}

OK!所有基礎類已經完成,最后寫一個config用來全部初始化和配置Shiro

@Configurationpublic class ShiroConfig { @Resource private MongoTemplate mongoTemplate; @Resource private SystemUserService systemUserService;// 這是用來判斷用戶名和密碼的service @Bean public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); shiroFilterFactoryBean.setLoginUrl("/login"); shiroFilterFactoryBean.setSuccessUrl("/index"); shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 攔截器. Map<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); return shiroFilterFactoryBean; } public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(  DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor adv = new AuthorizationAttributeSourceAdvisor(); adv.setSecurityManager(securityManager); return adv; } @Bean public DefaultWebSecurityManager securityManager(DefaultWebSessionManager sessionManager,  ShiroDbRealm myShiroRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 設置realm. securityManager.setRealm(myShiroRealm); securityManager.setSessionManager(sessionManager); return securityManager; } /** * 身份認證realm; (這里傳遞systemUserService給自定義的ShiroDbRealm初始化) *  * @return */ @Bean public ShiroDbRealm myShiroRealm() { ShiroDbRealm myShiroRealm = new ShiroDbRealm(systemUserService); return myShiroRealm; } @Bean public 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 = new SimpleCookie(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); return dao; } @Bean MongoDBSessionRepository shiroSessionRepository() { MongoDBSessionRepository resp = new MongoDBSessionRepository(mongoTemplate); return resp; }}

大功告成,這里只是一個簡單的配置,代碼也是我從項目里面節選和修改過的,至于在controller里面怎么使用,怎么做不同權限的鑒權工作那就在自己的代碼里面實現就行。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产免费一区二区三区在线能观看| 在线视频中文亚洲| 亚洲另类xxxx| 欧美日韩色婷婷| 亚洲国产女人aaa毛片在线| 亚洲欧美在线免费观看| 欧美成年人在线观看| 久久久久久久久久亚洲| 91在线免费视频| 日韩免费av在线| 久久久在线观看| 精品久久久久久久大神国产| 久久久久久久久网站| 欧美极品少妇与黑人| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲第一男人天堂| 91在线观看免费高清完整版在线观看| 久久久国产精品免费| 国产精品久久久久久久久久久久久久| 伊人亚洲福利一区二区三区| 午夜精品蜜臀一区二区三区免费| 亚洲free性xxxx护士hd| 1769国内精品视频在线播放| 亚洲第一网站免费视频| 欧美多人爱爱视频网站| 国产精品久久久一区| 精品美女永久免费视频| 欧美日韩亚洲激情| 亚洲国产美女精品久久久久∴| 日韩成人免费视频| 97在线视频免费观看| 色综合天天综合网国产成人网| 成人国产在线视频| 久久99精品国产99久久6尤物| 国产69久久精品成人| 在线精品国产成人综合| 亚洲欧美日韩一区在线| 北条麻妃一区二区三区中文字幕| 热久久这里只有| 国产精品久久久久免费a∨大胸| 亚洲free性xxxx护士白浆| 国产日韩在线看| 日韩一区二区av| 精品久久久久久久久久| 国产国语videosex另类| 精品久久久999| 国产精品一区二区三| 欧美区二区三区| 亚洲第一av网站| 国产成人精品免费久久久久| 亚洲电影成人av99爱色| 欧美精品国产精品日韩精品| 久久综合久久美利坚合众国| 国产精品视频久久久久| 中国china体内裑精亚洲片| 欧美日韩中文在线观看| 亚洲激情中文字幕| 国产一区视频在线| 日韩欧美在线视频观看| 欧美夫妻性生活视频| 91极品女神在线| 亚洲国产精品成人av| 成人xvideos免费视频| 久久99国产精品自在自在app| 欧美激情第99页| 午夜美女久久久久爽久久| 亚洲欧美综合另类中字| 国产精品第一页在线| 91在线看www| 欧美性猛交xxxx富婆弯腰| 国产精品小说在线| 亚洲一区二区三区久久| 亚洲偷欧美偷国内偷| 国产精品香蕉在线观看| 在线观看中文字幕亚洲| 色综久久综合桃花网| 清纯唯美日韩制服另类| 欧美视频在线免费看| 欧美精品少妇videofree| 亚洲天堂网在线观看| 欧美精品做受xxx性少妇| 欧美激情videoshd| 91在线观看免费| 亚洲成av人影院在线观看| 久久精品小视频| 亚洲人成在线一二| 日韩av网站大全| 日韩精品在线视频观看| 日本精品久久久久影院| 中文字幕日韩视频| 色av中文字幕一区| 亚洲国产精品悠悠久久琪琪| 国产999在线观看| 亚洲精品乱码久久久久久金桔影视| 精品福利视频导航| 精品丝袜一区二区三区| 亚洲激情小视频| 国产成人黄色av| 欧美一区亚洲一区| 91精品国产乱码久久久久久久久| 久久人人爽亚洲精品天堂| 国产亚洲在线播放| 欧美日韩免费看| 欧美黑人极品猛少妇色xxxxx| 欧美丝袜一区二区三区| 久久精品国产视频| 91免费看片网站| 欧美成人激情视频| 日韩在线激情视频| 亚洲一品av免费观看| 国产视频精品久久久| 97人人模人人爽人人喊中文字| 国产美女主播一区| 在线激情影院一区| 日韩精品免费一线在线观看| 8x海外华人永久免费日韩内陆视频| 一区二区三区美女xx视频| 亚洲毛片在线观看| 久久久精品国产一区二区| 亚洲天堂av综合网| 亚洲精品国产精品久久清纯直播| 日韩精品视频在线观看免费| 91精品国产免费久久久久久| 日韩av成人在线| 精品久久久久久亚洲国产300| 精品久久久久国产| 久久亚洲精品中文字幕冲田杏梨| 精品国偷自产在线| 国产精品444| 91久久国产精品91久久性色| 日本中文字幕久久看| 国内外成人免费激情在线视频网站| 亚洲美女视频网| 97久久超碰福利国产精品…| 亚洲国产天堂久久综合网| 国产亚洲激情在线| www国产亚洲精品久久网站| 一区二区亚洲欧洲国产日韩| 97香蕉超级碰碰久久免费软件| 福利视频第一区| 欧美成人精品一区二区| 精品久久久国产精品999| 久久久亚洲国产天美传媒修理工| 自拍偷拍亚洲欧美| 亚洲男人天堂手机在线| 国产综合色香蕉精品| 日韩免费不卡av| 国产999精品久久久| 4438全国亚洲精品在线观看视频| 亚洲精品在线观看www| 在线精品视频视频中文字幕| 日本精品久久久久久久| 777午夜精品福利在线观看| 亚洲精品自拍第一页| 亚洲bt欧美bt日本bt| 欧美黄色性视频| 亚洲精品一区二三区不卡| 亚洲石原莉奈一区二区在线观看| 91精品国产乱码久久久久久久久| 中文国产成人精品久久一| 国产一区二区动漫| 国产美女久久久| 91日韩在线视频| 色综合久久久久久中文网|