StringBoot整合Shiro

首先第一步引入

  <!--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;
        }
    

    ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容