您好,登錄后才能下訂單哦!
一、前言
為了管理擼主的小黃圖,特別安排了一個后臺管理系統,權限管理當然是首選 Shiro 了。
二、表設計
至少需要以下幾張表,具體如何設計要視自己的業務而定:
sys_user:用戶表
sys_role:角色表
sys_menu:菜單表
sys_user_role:用戶對應角色
sys_role_menu:用戶對應菜單
三、整合
pom.xml引入:
<dependency>?<groupId>org.apache.shiro</groupId>?<artifactId>shiro-spring-boot-web-starter</artifactId>?<version>1.4.2</version></dependency>
定義 UserRealm:
/**?*?用戶認證?*/public?class?UserRealm?extends?AuthorizingRealm?{ ?@Autowired?private?SysUserService?userService; ?/**?*?獲取授權?*?@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;?} ?/**?*?獲取認證?*?@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權限配置?*/@Configurationpublic?class?ShiroConfig?{ ?@Bean?public?UserRealm?userRealm()?{?return?new?UserRealm();?} ?@Bean?public?ShiroFilterFactoryBean?shiroFilterFactoryBean?(SecurityManager?securityManager)?{?ShiroFilterFactoryBean?shiroFilterFactoryBean?=?new?ShiroFilterFactoryBean();?//?必須設置SecuritManager?shiroFilterFactoryBean.setSecurityManager(securityManager);?//設置登錄頁?shiroFilterFactoryBean.setLoginUrl("/login.shtml");?//?登錄成功后要跳轉的鏈接,如果是ajax這里無效?shiroFilterFactoryBean.setSuccessUrl("/index");?//?未授權界面;?shiroFilterFactoryBean.setUnauthorizedUrl("/403");?//?攔截器?Map<String,?String>?filterChainDefinitionMap?=?new?LinkedHashMap<>();?//?過濾鏈定義,從上向下順序執行,一般將?/**放在最為下邊?//?authc:所有url都必須認證通過才可以訪問;?anon:所有url都都可以匿名訪問?/**?*?靜態文件?*/?filterChainDefinitionMap.put("/css/**","anon");?filterChainDefinitionMap.put("/images/**","anon");?filterChainDefinitionMap.put("/js/**","anon");?filterChainDefinitionMap.put("/file/**","anon");?/**?*?登錄注冊?*/?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");?/**?*?管理后臺?*/?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提供和多個默認的過濾器,我們可以用這些過濾器來配置過濾指定url的訪問權限,這里只介紹幾個比較常用的。
常用的權限控制注解,可以在控制器類上使用。
五、前端使用
過濾器實現了后端的權限控制訪問,那么如何在前端來使用注解實現按鈕的顯示呢?通常 thymeleaf 是 SpringBoot的標配模板了,這里我們使用第三方插件來實現。
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> <!--?認證通過或已記住的用戶。--><p?shiro:user="">Welcome?back?John!?Not?John??Click?<a?href="login.html">here</a>?to?login.</p> <!--?已認證通過的用戶。不包含已記住的用戶,這是與user標簽的區別所在。--><p?shiro:authenticated="">Hello,?<span?shiro:principal=""></span>,?how?are?you?today?</p> <a?shiro:authenticated=""?href="updateAccount.html">Update?your?contact?information</a> <!--?輸出當前用戶信息,通常為登錄帳號信息。--><p>Hello,?<shiro:principal/>,?how?are?you?today?</p> <!--?未認證通過用戶,與authenticated標簽相對應。與guest標簽的區別是,該標簽包含已記住用戶。--><p?shiro:notAuthenticated="">Please?<a?href="login.html">login</a>?in?order?to?update?your?credit?card?information.</p> <!--?驗證當前用戶是否屬于該角色。--><a?shiro:hasRole="admin"?href="admin.html">Administer?the?system</a><!--?擁有該角色?--> <!--?與hasRole標簽邏輯相反,當用戶不屬于該角色時驗證通過。--><p?shiro:lacksRole="developer"><!--?沒有該角色?-->Sorry,?you?are?not?allowed?to?developer?the?system.</p> <!--?驗證當前用戶是否屬于以下所有角色。--><p?shiro:hasAllRoles="developer,?2"><!--?角色與判斷?-->You?are?a?developer?and?a?admin.</p> <!--?驗證當前用戶是否屬于以下任意一個角色。--><p?shiro:hasAnyRoles="admin,?vip,?developer,1"><!--?角色或判斷?-->You?are?a?admin,?vip,?or?developer.</p> <!--驗證當前用戶是否擁有指定權限。--><a?shiro:hasPermission="userInfo:add"?href="createUser.html">添加用戶</a><!--?擁有權限?--> <!--?與hasPermission標簽邏輯相反,當前用戶沒有制定權限時,驗證通過。--><p?shiro:lacksPermission="userInfo:del"><!--?沒有權限?-->Sorry,?you?are?not?allowed?to?delete?user?accounts.</p> <!--?驗證當前用戶是否擁有以下所有角色。--><p?shiro:hasAllPermissions="userInfo:view,?userInfo:add"><!--?權限與判斷?-->You?can?see?or?add?users.</p> <!--?驗證當前用戶是否擁有以下任意一個權限。--><p?shiro:hasAnyPermissions="userInfo:view,?userInfo:del"><!--?權限或判斷?-->You?can?see?or?delete?users.</p><a?shiro:hasPermission="pp"?href="createUser.html">Create?a?new?User</a>
六、小結
小黃圖終于有后臺了!!!
讀者福利
加微信:haolagui521備注51CTO領取附送學習進階架構資料、PDF書籍文檔、面試資料
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。