日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

SpringBoot整合Shiro权限框架

發(fā)布時(shí)間:2023/12/3 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot整合Shiro权限框架 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在系統(tǒng)管理中,權(quán)限是非常重要的一個(gè)環(huán)節(jié)。目前權(quán)限框架中使用比較多的有Shiro、Spring Security。🎃
本篇簡(jiǎn)單寫(xiě)一下SpringBoot整合Shiro權(quán)限框架小栗子🌰。

個(gè)人博客地址:SpringBoot整合Shiro權(quán)限框架

介紹Shiro

Apache Shiro 是一個(gè)強(qiáng)大易用的 Java 安全框架,提供了認(rèn)證、授權(quán)、加密和會(huì)話管理等功能,對(duì)于任何一個(gè)應(yīng)用程序,Shiro 都可以提供全面的安全管理服務(wù)。并且相對(duì)于其他安全框架,Shiro 要簡(jiǎn)單的多。++更多詳細(xì)介紹參考:w3cschool-shiro++

🚀開(kāi)始

創(chuàng)建項(xiàng)目就不多嗦了,直接上干貨~~

相關(guān)依賴(lài)

<!-- web依賴(lài) --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 剔除spring logging依賴(lài),防止與log4j2沖突 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions> </dependency> <!-- log4j依賴(lài) --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- shiro 安全框架--> <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.6.0</version> </dependency>

系統(tǒng)配置

shiro權(quán)限的主要配置部分分為:

  • subject(可以認(rèn)為是一個(gè)認(rèn)證對(duì)象,與當(dāng)前應(yīng)用交互的任何東西都是subject)
  • securityManager(安全管理器,所有安全相關(guān)的東西都是跟它交互的,它管理著所有的subject)
  • realm(可以認(rèn)為是一個(gè)安全信息數(shù)據(jù)源,主要通過(guò)校驗(yàn)subject是否符合安全策略。所以我們?cè)谑褂胹hiro時(shí),需要先配置自己的realm)。

配置Realm

話不多說(shuō)上代碼~ 這里先以登錄認(rèn)證作為粟子

@Slf4j public class MyShiroRealm extends AuthorizingRealm {@Resourceprivate SysUserService sysUserService;/*** 授權(quán)信息配置* @param principals* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// 主要以登錄認(rèn)證作為例子, 此處暫時(shí)不做認(rèn)證, 之后例子做補(bǔ)充return null;}/*** 登錄認(rèn)證信息* @param token token* @return 認(rèn)證信息* @throws AuthenticationException e*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 返回認(rèn)證信息, 一般為用戶名Object principal = token.getPrincipal();if (ObjectUtil.isNull(principal)) {return null;}// 獲取數(shù)據(jù)庫(kù)中用戶信息String loginName = principal.toString();SysUser user = sysUserService.findSysUserByName(loginName);if (null == user) {log.debug("{} - 登錄用戶不存在!", loginName);throw new UnknownAccountException("登錄用戶不存在!");}// 使用鹽加密 構(gòu)造方法ByteSource credentialsSalt = ByteSource.Util.bytes(loginName);;SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user, user.getLoginPwd(), credentialsSalt, getName());// 驗(yàn)證信息//SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user, user.getLoginPwd(), getName());log.debug("驗(yàn)證登錄信息: {} ===>>>> {}", loginName, simpleAuthenticationInfo.getPrincipals());return simpleAuthenticationInfo;} }

配置安全策略

增加完Realm域配置,我們需要讓此配置生效,所以需要將它添加給Shiro的安全管理策略。

/*** 自定義安全管理策略*/ @Bean public SecurityManager securityManager(MyShiroRealm myShiroRealm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 設(shè)置自定義的realmsecurityManager.setRealm(myShiroRealm);return securityManager; } /*** 地址過(guò)濾器** @param securityManager* @return*/ @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();// 設(shè)置安全管理shiroFilterFactoryBean.setSecurityManager(securityManager);// 設(shè)置登錄地址shiroFilterFactoryBean.setLoginUrl("/login");// 設(shè)置主頁(yè)地址shiroFilterFactoryBean.setSuccessUrl("/index");// 設(shè)置未授權(quán)的urlshiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();// 開(kāi)放登錄接口filterChainDefinitionMap.put("/doLogin", "anon");// 生成驗(yàn)證碼接口filterChainDefinitionMap.put("/captcha/captchaImg", "anon");// 開(kāi)放靜態(tài)資源文件filterChainDefinitionMap.put("/assets/**", "anon");// 其余url全部攔截,必須放在最后filterChainDefinitionMap.put("/**", "authc");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean; }/*** shiro生命周期* @return*/ @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor(); }/*** shiro注解啟用配置* @return*/ @Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);return defaultAdvisorAutoProxyCreator; }/**** @param securityManager* @return*/ @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor sourceAdvisor = new AuthorizationAttributeSourceAdvisor();sourceAdvisor.setSecurityManager(securityManager);return sourceAdvisor; }

登錄

設(shè)置完自定義域,以及自定義策略我們shiro就可以進(jìn)行下一步了,那就是接口認(rèn)證操作,這里簡(jiǎn)單定義一個(gè)接口

/*** 登錄操作** @param loginName 登錄名* @param loginPwd 登錄密碼* @return url*/ @ResponseBody @PostMapping("/doLogin") public Result<String> doLogin(String loginName, String loginPwd, String captcha, boolean rememberMe, HttpServletRequest request) {// 驗(yàn)證碼校驗(yàn)String sessionCaptcha = (String) request.getSession().getAttribute(AppConstants.CAPTCHA_KEY);if (!StringUtils.equalsIgnoreCase(captcha, sessionCaptcha)) {return Result.error("驗(yàn)證碼不匹配!");}UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginName, loginPwd, rememberMe);Subject subject = SecurityUtils.getSubject();try {// 認(rèn)證操作subject.login(usernamePasswordToken);// 獲取登錄的用戶SysUser user = (SysUser) subject.getPrincipal();// 將用戶信息存入cookie中Session session = subject.getSession();session.setAttribute("user", user);// 刪除session驗(yàn)證碼request.getSession().removeAttribute(AppConstants.CAPTCHA_KEY);} catch (UnknownAccountException e) {log.debug("未知用戶! {}", e.getMessage());return Result.error("未知用戶!");} catch (IncorrectCredentialsException e) {log.debug("{} - 用戶登錄密碼校驗(yàn)異常! {}", loginName, e.getMessage());return Result.error("密碼校驗(yàn)異常!");} catch (AuthenticationException e) {log.debug("{} - 用戶登錄認(rèn)證失敗! {}", loginName, e.getMessage());return Result.error("登錄失敗!");} catch (Exception e) {log.debug("{} - 用戶登錄異常! {}", loginName, e.getMessage());return Result.error("登錄異常!");}return Result.success("登錄成功!"); }

測(cè)試

接口定義完,我們需要一個(gè)登錄頁(yè)面來(lái)完成登錄認(rèn)證操作,這里使用我之前寫(xiě)的登錄頁(yè)面來(lái)完成。

點(diǎn)擊登錄后觀察接口執(zhí)行情況:

當(dāng)執(zhí)行到subject.login()方法后,會(huì)進(jìn)行認(rèn)證操作,這時(shí)候就會(huì)執(zhí)行到我們?cè)O(shè)置的自定義Realm。紅框處是我們做完登錄用戶與數(shù)據(jù)庫(kù)中比對(duì)過(guò)后,將用戶信息存到了認(rèn)證信息中并返回給接口。

最后頁(yè)面成功跳轉(zhuǎn)至新頁(yè)面,我們就完成了登錄認(rèn)證操作啦。🕛

END

簡(jiǎn)單的完成了一個(gè)登錄認(rèn)證的操作,之后會(huì)慢慢更新shiro的其他功能😀

總結(jié)

以上是生活随笔為你收集整理的SpringBoot整合Shiro权限框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。