您好,登錄后才能下訂單哦!
一、前言
為了管理擼主的小黃圖,特別安排了一個(gè)后臺(tái)管理系統(tǒng),權(quán)限管理當(dāng)然是首選 Shiro 了。
二、表設(shè)計(jì)
至少需要以下幾張表,具體如何設(shè)計(jì)要視自己的業(yè)務(wù)而定:
sys_user:用戶表
sys_role:角色表
sys_menu:菜單表
sys_user_role:用戶對(duì)應(yīng)角色
sys_role_menu:用戶對(duì)應(yīng)菜單
三、整合
pom.xml引入:
<dependency>?<groupId>org.apache.shiro</groupId>?<artifactId>shiro-spring-boot-web-starter</artifactId>?<version>1.4.2</version></dependency>
定義 UserRealm:
/**?*?用戶認(rèn)證?*/public?class?UserRealm?extends?AuthorizingRealm?{ ?@Autowired?private?SysUserService?userService; ?/**?*?獲取授權(quán)?*?@param?principalCollection?*?@return?*/?@Override?protected?AuthorizationInfo?doGetAuthorizationInfo(PrincipalCollection?principalCollection)?{?Long?userId?=?ShiroUtils.getUserId();?List<String>?rolesSet?=?userService.listUserRoles(userId);?List<String>?permsSet?=?userService.listUserPerms(userId);?SimpleAuthorizationInfo?info?=?new?SimpleAuthorizationInfo();?info.setRoles(new?HashSet<>(rolesSet));?info.setStringPermissions(new?HashSet<>(permsSet));?return?info;?} ?/**?*?獲取認(rèn)證?*?@param?authenticationToken?*?@return?*?@throws?AuthenticationException?*/?@Override?protected?AuthenticationInfo?doGetAuthenticationInfo(AuthenticationToken?authenticationToken)?throws?AuthenticationException?{?String?username?=?(String)?authenticationToken.getPrincipal();?String?password?=?new?String((char[])?authenticationToken.getCredentials());?SysUser?user?=?userService.getUser(username);?if?(user?==?null)?{?throw?new?UnknownAccountException("賬戶不存在");?}?if(!password.equals(user.getPassword()))?{?throw?new?IncorrectCredentialsException("密碼不正確");?}?return?new?SimpleAuthenticationInfo(user,?password,?getName());?}}
定義 ShiroConfig:
/**?*?Shiro權(quán)限配置?*/@Configurationpublic?class?ShiroConfig?{ ?@Bean?public?UserRealm?userRealm()?{?return?new?UserRealm();?} ?@Bean?public?ShiroFilterFactoryBean?shiroFilterFactoryBean?(SecurityManager?securityManager)?{?ShiroFilterFactoryBean?shiroFilterFactoryBean?=?new?ShiroFilterFactoryBean();?//?必須設(shè)置SecuritManager?shiroFilterFactoryBean.setSecurityManager(securityManager);?//設(shè)置登錄頁?shiroFilterFactoryBean.setLoginUrl("/login.shtml");?//?登錄成功后要跳轉(zhuǎn)的鏈接,如果是ajax這里無效?shiroFilterFactoryBean.setSuccessUrl("/index");?//?未授權(quán)界面;?shiroFilterFactoryBean.setUnauthorizedUrl("/403");?//?攔截器?Map<String,?String>?filterChainDefinitionMap?=?new?LinkedHashMap<>();?//?過濾鏈定義,從上向下順序執(zhí)行,一般將?/**放在最為下邊?//?authc:所有url都必須認(rèn)證通過才可以訪問;?anon:所有url都都可以匿名訪問?/**?*?靜態(tài)文件?*/?filterChainDefinitionMap.put("/css/**","anon");?filterChainDefinitionMap.put("/images/**","anon");?filterChainDefinitionMap.put("/js/**","anon");?filterChainDefinitionMap.put("/file/**","anon");?/**?*?登錄注冊(cè)?*/?filterChainDefinitionMap.put("/register.shtml","anon");?filterChainDefinitionMap.put("/login.shtml","anon");?filterChainDefinitionMap.put("/sys/logout","anon");?filterChainDefinitionMap.put("/sys/login","anon");?filterChainDefinitionMap.put("/sys/register","anon");?/**?*?管理后臺(tái)?*/?filterChainDefinitionMap.put("/sys/**",?"roles[admin]");?filterChainDefinitionMap.put("/**",?"authc");?shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);?return?shiroFilterFactoryBean;?} ?@Bean?public?SessionsSecurityManager?securityManager()?{?DefaultWebSecurityManager?securityManager?=?new?DefaultWebSecurityManager();?securityManager.setRealm(userRealm());?securityManager.setSessionManager(sessionManager());?return?securityManager;?}?@Bean?public?DefaultWebSessionManager?sessionManager()?{?DefaultWebSessionManager?sessionManager?=?new?DefaultWebSessionManager();?//去掉小尾巴?JSESSIONID?sessionManager.setSessionIdUrlRewritingEnabled(false);?long?time?=?2*60*60*1000;?sessionManager.setGlobalSessionTimeout(time);?return?sessionManager;?}}
登錄 LoginController:
/**?*?登錄?*/@Controller@RequestMapping("/sys")public?class?LoginController?{ ?private?static?final?Logger?logger?=?LoggerFactory.getLogger(LoginController.class); ?@Autowired?private?SysUserService?sysUserService; ?/**?*?登錄?*/?@PostMapping("/login")?@ResponseBody?public?Result?login(String?username,?String?password){?logger.info("用戶登錄");?try{?Subject?subject?=?ShiroUtils.getSubject();?password?=?MD5Utils.encrypt(username,?password);?UsernamePasswordToken?token?=?new?UsernamePasswordToken(username,?password);?subject.login(token);?}catch?(Exception?e)?{?e.printStackTrace();?return?Result.error("登錄失敗");?}?return?Result.ok("登錄成功");?}}
四、過濾器
shiro提供和多個(gè)默認(rèn)的過濾器,我們可以用這些過濾器來配置過濾指定url的訪問權(quán)限,這里只介紹幾個(gè)比較常用的。
常用的權(quán)限控制注解,可以在控制器類上使用。
五、前端使用
過濾器實(shí)現(xiàn)了后端的權(quán)限控制訪問,那么如何在前端來使用注解實(shí)現(xiàn)按鈕的顯示呢?通常 thymeleaf 是 SpringBoot的標(biāo)配模板了,這里我們使用第三方插件來實(shí)現(xiàn)。
pom.xml引入:
<dependency>?<groupId>com.github.theborakompanioni</groupId>?<artifactId>thymeleaf-extras-shiro</artifactId>?<version>2.0.0</version></dependency>
ShiroConfig 追加以下代碼:
@Beanpublic?ShiroDialect?shiroDialect(){?return?new?ShiroDialect();}
頁面頭部引入:
<!DOCTYPE?html><html?xmlns:th="http://www.thymeleaf.org"?xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
頁面使用:
<!--?顯示登陸用戶昵稱?--><shiro:principal?property="nickname"/> <!--?游客?--><p?shiro:guest="">Please?<a?href="login.html">login</a></p> <!--?認(rèn)證通過或已記住的用戶。--><p?shiro:user="">Welcome?back?John!?Not?John??Click?<a?href="login.html">here</a>?to?login.</p> <!--?已認(rèn)證通過的用戶。不包含已記住的用戶,這是與user標(biāo)簽的區(qū)別所在。--><p?shiro:authenticated="">Hello,?<span?shiro:principal=""></span>,?how?are?you?today?</p> <a?shiro:authenticated=""?href="updateAccount.html">Update?your?contact?information</a> <!--?輸出當(dāng)前用戶信息,通常為登錄帳號(hào)信息。--><p>Hello,?<shiro:principal/>,?how?are?you?today?</p> <!--?未認(rèn)證通過用戶,與authenticated標(biāo)簽相對(duì)應(yīng)。與guest標(biāo)簽的區(qū)別是,該標(biāo)簽包含已記住用戶。--><p?shiro:notAuthenticated="">Please?<a?href="login.html">login</a>?in?order?to?update?your?credit?card?information.</p> <!--?驗(yàn)證當(dāng)前用戶是否屬于該角色。--><a?shiro:hasRole="admin"?href="admin.html">Administer?the?system</a><!--?擁有該角色?--> <!--?與hasRole標(biāo)簽邏輯相反,當(dāng)用戶不屬于該角色時(shí)驗(yàn)證通過。--><p?shiro:lacksRole="developer"><!--?沒有該角色?-->Sorry,?you?are?not?allowed?to?developer?the?system.</p> <!--?驗(yàn)證當(dāng)前用戶是否屬于以下所有角色。--><p?shiro:hasAllRoles="developer,?2"><!--?角色與判斷?-->You?are?a?developer?and?a?admin.</p> <!--?驗(yàn)證當(dāng)前用戶是否屬于以下任意一個(gè)角色。--><p?shiro:hasAnyRoles="admin,?vip,?developer,1"><!--?角色或判斷?-->You?are?a?admin,?vip,?or?developer.</p> <!--驗(yàn)證當(dāng)前用戶是否擁有指定權(quán)限。--><a?shiro:hasPermission="userInfo:add"?href="createUser.html">添加用戶</a><!--?擁有權(quán)限?--> <!--?與hasPermission標(biāo)簽邏輯相反,當(dāng)前用戶沒有制定權(quán)限時(shí),驗(yàn)證通過。--><p?shiro:lacksPermission="userInfo:del"><!--?沒有權(quán)限?-->Sorry,?you?are?not?allowed?to?delete?user?accounts.</p> <!--?驗(yàn)證當(dāng)前用戶是否擁有以下所有角色。--><p?shiro:hasAllPermissions="userInfo:view,?userInfo:add"><!--?權(quán)限與判斷?-->You?can?see?or?add?users.</p> <!--?驗(yàn)證當(dāng)前用戶是否擁有以下任意一個(gè)權(quán)限。--><p?shiro:hasAnyPermissions="userInfo:view,?userInfo:del"><!--?權(quán)限或判斷?-->You?can?see?or?delete?users.</p><a?shiro:hasPermission="pp"?href="createUser.html">Create?a?new?User</a>
六、小結(jié)
小黃圖終于有后臺(tái)了?。?!
讀者福利
加微信:haolagui521備注51CTO領(lǐng)取附送學(xué)習(xí)進(jìn)階架構(gòu)資料、PDF書籍文檔、面試資料
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。