首先第一步引入
<!--shiro權(quán)限控制框架-->
<dependency> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
添加配置類
-
安全管理器(在管理器中添加自己的驗(yàn)證密碼和權(quán)限的方法)
@Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); return securityManager; }
-
配置攔截鏈
攔截鏈的意思,就是給url賦值權(quán)限
/** * ShiroFilterFactoryBean 處理攔截資源文件問題。 * 注意:?jiǎn)为?dú)一個(gè)ShiroFilterFactoryBean配置是或報(bào)錯(cuò)的,以為在 * 初始化ShiroFilterFactoryBean的時(shí)候需要注入:SecurityManager * * Filter Chain定義說明 1、一個(gè)URL可以配置多個(gè)Filter,使用逗號(hào)分隔 2、當(dāng)設(shè)置多個(gè)過濾器時(shí),全部驗(yàn)證通過,才視為通過 * 3、部分過濾器可指定參數(shù),如perms,roles * */ @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); // 必須設(shè)置 SecurityManager shiroFilterFactoryBean.setSecurityManager(securityManager); // 如果不設(shè)置默認(rèn)會(huì)自動(dòng)尋找Web工程根目錄下的"admin登錄頁(yè)面"頁(yè)面 shiroFilterFactoryBean.setLoginUrl("/admin/login"); // 登錄成功后要跳轉(zhuǎn)的鏈接 shiroFilterFactoryBean.setSuccessUrl("/index"); // 未授權(quán)界面; shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 攔截器. Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); filterChainDefinitionMap.put("/admin/login", "anon");//登錄頁(yè)面 //TODO 跟登錄權(quán)限,添加權(quán)限test測(cè)試。 filterChainDefinitionMap.put("/admin/index", "authc,perms[" +"test" + "]");//校驗(yàn)密碼和權(quán)限 // 配置退出過濾器,其中的具體的退出代碼Shiro已經(jīng)替我們實(shí)現(xiàn)了 filterChainDefinitionMap.put("/logout", "logout"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }
實(shí)現(xiàn)Realm
-
doGetAuthenticationInfo
校驗(yàn)密碼
/** * 校驗(yàn)用戶名和密碼 * * @param authcToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { logger.debug("身份認(rèn)證方法:MyShiroRealm.doGetAuthenticationInfo()"); UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authcToken; //TODO 根據(jù)用戶名和用戶密碼判斷用戶,用戶驗(yàn)證成功,就把用戶名和用戶密碼放行 String userName = usernamePasswordToken.getUsername(); Admin user = mongoDao.findOneByQuery(Admin.class, "userName", usernamePasswordToken.getUsername()); String pwd = String.valueOf(usernamePasswordToken.getPassword()); if (ObjectUtils.isEmpty(user)){ throw new IncorrectCredentialsException(); } if (StringUtils.endsWithIgnoreCase(user.getPassword(), pwd)) { return new SimpleAuthenticationInfo(userName, pwd, getName()); } return null; }
-
doGetAuthorizationInfo
在本方法中,查詢用戶的所有權(quán)限,然后添加
/** * 權(quán)限鏈配置 * 在shiro配置類中把資源對(duì)應(yīng)的權(quán)限都加載到應(yīng)用中 * * 在本方法中,查詢用戶的所有權(quán)限,然后添加 * * @param principals * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { logger.debug("##################執(zhí)行Shiro權(quán)限認(rèn)證##################"); //獲取當(dāng)前登錄輸入的用戶名,等價(jià)于 String userName = (String) super.getAvailablePrincipal(principals); logger.debug("##################開始查詢用戶【" + userName + "】的權(quán)限##################"); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //根據(jù)每個(gè)用戶名獲得對(duì)應(yīng)的權(quán)限列表 //根據(jù)用戶名獲取用戶的權(quán)限 info.addStringPermission("test"); return info; }
?