摘要:這里使用來實現權限驗證引入依賴定義注解后臺登錄授權權限驗證的注解此注解只能修飾方法當前注解如何去保持攔截實現登錄和權限驗證登錄驗證登錄驗證驗證判斷是否進行權限驗證從切面中獲取當前方法得到了方提取出他的注解進行權限驗證權限驗證為最高
這里使用 aop 來實現權限驗證引入依賴
定義注解org.springframework.boot spring-boot-starter-aop
package com.lmxdawn.api.admin.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 后臺登錄授權/權限驗證的注解 */ //此注解只能修飾方法 @Target(ElementType.METHOD) //當前注解如何去保持 @Retention(RetentionPolicy.RUNTIME) public @interface AuthRuleAnnotation { String value(); }攔截實現登錄和權限驗證
package com.lmxdawn.api.admin.aspect; import com.lmxdawn.api.admin.annotation.AuthRuleAnnotation; import com.lmxdawn.api.admin.enums.ResultEnum; import com.lmxdawn.api.admin.exception.JsonException; import com.lmxdawn.api.admin.service.auth.AuthLoginService; import com.lmxdawn.api.common.utils.JwtUtils; import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.List; /** * 登錄驗證 AOP */ @Aspect @Component @Slf4j public class AuthorizeAspect { @Resource private AuthLoginService authLoginService; @Pointcut("@annotation(com.lmxdawn.api.admin.annotation.AuthRuleAnnotation)") public void adminLoginVerify() { } /** * 登錄驗證 * * @param joinPoint */ @Before("adminLoginVerify()") public void doAdminAuthVerify(JoinPoint joinPoint) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes == null) { throw new JsonException(ResultEnum.NOT_NETWORK); } HttpServletRequest request = attributes.getRequest(); String id = request.getHeader("X-Adminid"); Long adminId = Long.valueOf(id); String token = request.getHeader("X-Token"); if (token == null) { throw new JsonException(ResultEnum.LOGIN_VERIFY_FALL); } // 驗證 token Claims claims = JwtUtils.parse(token); if (claims == null) { throw new JsonException(ResultEnum.LOGIN_VERIFY_FALL); } Long jwtAdminId = Long.valueOf(claims.get("admin_id").toString()); if (adminId.compareTo(jwtAdminId) != 0) { throw new JsonException(ResultEnum.LOGIN_VERIFY_FALL); } // 判斷是否進行權限驗證 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //從切面中獲取當前方法 Method method = signature.getMethod(); //得到了方,提取出他的注解 AuthRuleAnnotation action = method.getAnnotation(AuthRuleAnnotation.class); // 進行權限驗證 authRuleVerify(action.value(), adminId); } /** * 權限驗證 * * @param authRule */ private void authRuleVerify(String authRule, Long adminId) { if (authRule != null && authRule.length() > 0) { ListController 中使用authRules = authLoginService.listRuleByAdminId(adminId); // admin 為最高權限 for (String item : authRules) { if (item.equals("admin") || item.equals(authRule)) { return; } } throw new JsonException(ResultEnum.AUTH_FAILED); } } }
使用 AuthRuleAnnotation 注解, value 值就是在數據庫里面定義的 權限規則名稱
/** * 獲取管理員列表 */ @AuthRuleAnnotation("admin/auth/admin/index") @GetMapping("/admin/auth/admin/index") public ResultVO index(@Valid AuthAdminQueryForm authAdminQueryForm, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); } if (authAdminQueryForm.getRoleId() != null) { List相關地址authRoleAdmins = authRoleAdminService.listByRoleId(authAdminQueryForm.getRoleId()); List ids = new ArrayList<>(); if (authRoleAdmins != null && !authRoleAdmins.isEmpty()) { ids = authRoleAdmins.stream().map(AuthRoleAdmin::getAdminId).collect(Collectors.toList()); } authAdminQueryForm.setIds(ids); } List authAdminList = authAdminService.listAdminPage(authAdminQueryForm); // 查詢所有的權限 List adminIds = authAdminList.stream().map(AuthAdmin::getId).collect(Collectors.toList()); List authRoleAdminList = authRoleAdminService.listByAdminIdIn(adminIds); // 視圖列表 List authAdminVoList = authAdminList.stream().map(item -> { AuthAdminVo authAdminVo = new AuthAdminVo(); BeanUtils.copyProperties(item, authAdminVo); List roles = authRoleAdminList.stream() .filter(authRoleAdmin -> authAdminVo.getId().equals(authRoleAdmin.getAdminId())) .map(AuthRoleAdmin::getRoleId) .collect(Collectors.toList()); authAdminVo.setRoles(roles); return authAdminVo; }).collect(Collectors.toList()); PageInfo authAdminPageInfo = new PageInfo<>(authAdminList); PageSimpleVO authAdminPageSimpleVO = new PageSimpleVO<>(); authAdminPageSimpleVO.setTotal(authAdminPageInfo.getTotal()); authAdminPageSimpleVO.setList(authAdminVoList); return ResultVOUtils.success(authAdminPageSimpleVO); }
GitHub 地址: https://github.com/lmxdawn/vu...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72376.html
摘要:創建應用有很多方法去創建項目,官方也推薦用在線項目創建工具可以方便選擇你要用的組件,命令行工具當然也可以。對于開發人員最大的好處在于可以對應用進行自動配置。 使用JWT保護你的Spring Boot應用 - Spring Security實戰 作者 freewolf 原創文章轉載請標明出處 關鍵詞 Spring Boot、OAuth 2.0、JWT、Spring Security、SS...
摘要:在進行一些公司內部系統開發中,經常會需要對接公司內部統一的權限管理系統進行權限角色驗證等等。在實際開發過程中可以借助的實現權限驗證功能。 在進行一些公司內部系統開發中,經常會需要對接公司內部統一的權限管理系統進行權限角色驗證等等。在實際開發過程中可以借助Spring的Session Repository實現權限驗證功能。實現步驟如下: 一、添加自定義Session注解EnableUse...
摘要:中的攔截器在開發中,攔截器是經常用到的功能。該攔截器只能過濾請求,允許多個攔截器同時存在,通過攔截器鏈管理。當時不再執行后續的攔截器鏈及被攔截的請求。實現攔截器大致也分為兩種,一種是實現接口,另一種利用的注解或配置。 Spring中的攔截器 在web開發中,攔截器是經常用到的功能。它可以幫我們驗證是否登陸、權限認證、數據校驗、預先設置數據以及統計方法的執行效率等等。今天就來詳細的談...
摘要:后面的文章將圍繞著集成來進行展開。表示當前已經身份驗證或者通過記住我登錄的。表示當前需要角色和。參考資料系列十五安全框架一基本功能權限管理學習資料使用手冊跟開濤學博客版跟開濤學版官方文檔 導讀: 在閱讀這篇文章之前假設你已經對Apache Shiro(后面統一用Shiro作為代指)有了一定的了解,如果你還對Shiro不熟悉的話在這篇文章的結尾附有相關的學習資料,關于Shiro是用來做什...
摘要:后面的文章將圍繞著集成來進行展開。表示當前已經身份驗證或者通過記住我登錄的。表示當前需要角色和。參考資料系列十五安全框架一基本功能權限管理學習資料使用手冊跟開濤學博客版跟開濤學版官方文檔 導讀: 在閱讀這篇文章之前假設你已經對Apache Shiro(后面統一用Shiro作為代指)有了一定的了解,如果你還對Shiro不熟悉的話在這篇文章的結尾附有相關的學習資料,關于Shiro是用來做什...
閱讀 2695·2023-04-25 17:21
閱讀 2558·2021-11-23 09:51
閱讀 2850·2021-09-24 10:32
閱讀 3780·2021-09-23 11:33
閱讀 1980·2019-08-30 15:44
閱讀 3458·2019-08-30 11:18
閱讀 3531·2019-08-30 10:53
閱讀 631·2019-08-26 13:25