溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架

發(fā)布時(shí)間:2020-08-11 12:27:06 來源:網(wǎng)絡(luò) 閱讀:512 作者:wx5d30212829a35 欄目:編程語言

一、前言

為了管理擼主的小黃圖,特別安排了一個(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è)比較常用的。


SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架


常用的權(quán)限控制注解,可以在控制器類上使用。

SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架


五、前端使用

過濾器實(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é)

SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架



SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架


小黃圖終于有后臺(tái)了?。?!


讀者福利

加微信:haolagui521備注51CTO領(lǐng)取附送學(xué)習(xí)進(jìn)階架構(gòu)資料、PDF書籍文檔、面試資料

SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架

SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架


SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架SpringBoot 2.0 開發(fā)案例之整合Shiro安全框架


向AI問一下細(xì)節(jié)

免責(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)容。

AI