亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

Spring實現(xiàn)擁有者權(quán)限驗證的方法示例

2024-07-14 08:43:53
字體:
供稿:網(wǎng)友

問題描述

在做權(quán)限驗證的時候,我們經(jīng)常會遇到這樣的情況:教師擁有多個學(xué)生,但是在處理學(xué)生信息的時候,教師只能操作自己班級的學(xué)生。所以,我們要做的就是,當(dāng)教師嘗試處理別的班的學(xué)生的時候,拋出異常。

實體關(guān)系

用戶1:1教師,教師m:n班級,班級1:n學(xué)生

Spring,擁有者,權(quán)限驗證

實現(xiàn)思路

findById為例。因為從整體上看,用戶學(xué)生m:n的關(guān)系,所以在調(diào)用這個接口的時候,獲取該學(xué)生的所有用戶,然后跟當(dāng)前登錄用戶進行對比,如果不在其中,拋出異常。

利用切面,我們可以在findByIdupdate、delete方法上進行驗證。

注解

我們會在方法上添加注解,以表示對該方法進行權(quán)限驗證。

@Target(ElementType.METHOD)     // 注解使用在方法上@Retention(RetentionPolicy.RUNTIME) // 運行時生效public @interface AuthorityAnnotation {  /**   * 倉庫名   */  @Required  Class repository();}

因為我們需要獲取出學(xué)生,但是并不限于學(xué)生,所以就要將倉庫repository作為一個參數(shù)傳入。

實體

上面我們說過,需要獲取學(xué)生中的用戶,所以我們可以在實體中定義一個方法,獲取所有有權(quán)限的用戶:getBelongUsers()

但是,我們知道,學(xué)生和用戶沒用直接的關(guān)系,而且為了復(fù)用,在對其他實體進行驗證的時候也能使用,可以考慮創(chuàng)建一個接口,讓需要驗證的實體去實現(xiàn)他。

Spring,擁有者,權(quán)限驗證

這樣,我們可以在讓每個實體都集成這個接口,然后形成鏈?zhǔn)秸{(diào)用,這樣就解決了上面你的兩個問題。

public interface BaseEntity {  List<User> getBelongToUsers();}

教師:

@Entitypublic class Teacher implements YunzhiEntity, BaseEntity {  ...  @Override  public List<User> getBelongToUsers() {    List<User> userList = new ArrayList<>();    userList.add(this.getUser());    return userList;  }}

班級:

@Entitypublic class Klass implements BaseEntity {  ...  @Override  public List<User> getBelongToUsers() {    List<User> userList = new ArrayList<>();    for (Teacher teacher: this.getTeacherList()) {      userList.addAll(teacher.getBelongToUsers());    }    return userList;  }}

學(xué)生:

@Entitypublic class Student implements BaseEntity {  ...  @Override  public List<User> getBelongToUsers() {    return this.getKlass().getBelongToUsers();  }}

切面

有了實體后,我們就可以建立切面實現(xiàn)驗證功能了。

@Aspect@Componentpublic class OwnerAuthorityAspect {  private static final Logger logger = LoggerFactory.getLogger(OwnerAuthorityAspect.class.getName());  /**   * 使用注解,并第一個參數(shù)為id   */  @Pointcut("@annotation(com.yunzhiclub.alice.annotation.AuthorityAnnotation) && args(id,..) && @annotation(authorityAnnotation)")  public void doAccessCheck(Long id, AuthorityAnnotation authorityAnnotation) {   }    @Before("doAccessCheck(id, authorityAnnotation)")  public void before(Long id, AuthorityAnnotation authorityAnnotation) {  }

首先,我們要獲取到待操作對象。但是在獲取對象之前,我們必須獲取到repository。

這里我們利用applicationContext來獲取倉庫bean,然后再利用獲取到的bean,生成repository對象。

@Aspect@Componentpublic class OwnerAuthorityAspect implements ApplicationContextAware {  private ApplicationContext applicationContext = null;  // 初始化上下文  ......  @Before("doAccessCheck(id, authorityAnnotation)")  public void before(Long id, AuthorityAnnotation authorityAnnotation) {    logger.debug("獲取注解上的repository, 并通過applicationContext來獲取bean");    Class<?> repositoryClass = authorityAnnotation.repository();    Object object = applicationContext.getBean(repositoryClass);    logger.debug("將Bean轉(zhuǎn)換為CrudRepository");    CrudRepository<BaseEntity, Object> crudRepository = (CrudRepository<BaseEntity, Object>)object;  }  @Override  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    this.applicationContext = applicationContext;  }}

該類實現(xiàn)了ApplicationContextAware接口,通過setApplicationContext函數(shù)獲取到了applicationContext。

接下來,就是利用repository獲取對象,然后獲取他的所屬用戶,再與當(dāng)前登錄用戶進行比較。

@Before("doAccessCheck(id, authorityAnnotation)")public void before(Long id, AuthorityAnnotation authorityAnnotation) {  logger.debug("獲取注解上的repository, 并通過applicationContext來獲取bean");  Class<?> repositoryClass = authorityAnnotation.repository();  Object object = applicationContext.getBean(repositoryClass);  logger.debug("將Bean轉(zhuǎn)換為CrudRepository");  CrudRepository<BaseEntity, Object> crudRepository = (CrudRepository<BaseEntity, Object>)object;  logger.debug("獲取實體對象");  Optional<BaseEntity> baseEntityOptional = crudRepository.findById(id);  if(!baseEntityOptional.isPresent()) {    throw new RuntimeException("對不起,未找到相關(guān)的記錄");  }  BaseEntity baseEntity = baseEntityOptional.get();  logger.debug("獲取登錄用戶以及擁有者,并進行比對");  List<User> belongToTUsers = baseEntity.getBelongToUsers();  User currentLoginUser = userService.getCurrentLoginUser();  Boolean havePermission = false;  if (currentLoginUser != null && belongToTUsers.size() != 0) {    for (User user: belongToTUsers) {      if (user.getId().equals(currentLoginUser.getId())) {        havePermission = true;        break;      }  }    if (!havePermission) {      throw new RuntimeException("權(quán)限不允許");    }  }}

使用

在控制器的方法上使用注解:@AuthorityAnnotation,傳入repository。

@RestController@RequestMapping("/student")public class StudentController {  private final StudentService studentService;  // 學(xué)生  @Autowired  public StudentController(StudentService studentService) {    this.studentService = studentService;  }  /**   * 通過id獲取學(xué)生   *   * @param id   * @return   */  @AuthorityAnnotation(repository = StudentRepository.class)  @GetMapping("/{id}")  @JsonView(StudentJsonView.get.class)  public Student findById(@PathVariable Long id) {    return studentService.findById(id);  }}

出現(xiàn)的問題

實現(xiàn)之后,進行單元測試的過程中出現(xiàn)了問題。

@Testpublic void update() throws Exception {  logger.info("獲取一個保存學(xué)生");  Student student = studentService.getOneSaveStudent();  Long id = student.getId();  logger.info("獲取一個更新學(xué)生");  Student newStudent = studentService.getOneUnSaveStudent();  String jsonString = JSONObject.toJSONString(newStudent);  logger.info("發(fā)送更新請求");  this.mockMvc    .perform(put(baseUrl + "/" + id)      .cookie(this.cookie)      .content(jsonString)      .contentType(MediaType.APPLICATION_JSON_UTF8))    .andExpect(status().isOk());}

Spring,擁有者,權(quán)限驗證

400的錯誤,說明參數(shù)錯誤,參數(shù)傳的是實體,看下傳了什么:

Spring,擁有者,權(quán)限驗證

我們看到,這個字段并不是我們實體中的字段,但是為什么序列化的時候出現(xiàn)了這個字段呢?

原因是這樣的,我們在實體中定義了一個getBelongToUsers函數(shù),然后JSONobject在進行序列化的時候會根據(jù)實體中的getter方法,獲取get后面的為key,也就是將belongToUsers看做了字段。

所以就出現(xiàn)了上面?zhèn)鲗嶓w字段多出的情況,從而引發(fā)了400的錯誤。

解決

我們不想JSONobject在序列化的時候處理getBelongToUsers,就需要聲明一下,這里用到了注解:@JsonIgnore。這樣在序列化的時候就會忽略它。

@Entitypublic class Student implements BaseEntity {  ......  @JsonIgnore  @Override  public List<User> getBelongToUsers() {    return this.getKlass().getBelongToUsers();  }}

修改后的學(xué)生實體如上,其他實現(xiàn)了getBelongToUsers方法的,都需要做相同處理。

總結(jié)

 以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
天堂地址在线www| 国产成人免费视频app| 自拍视频亚洲| 图片区小说区国产精品视频| 成人网在线免费看| 97视频网站| 免费黄色小视频在线观看| 成年免费视频| 久草视频免费在线| 国产精品永久入口久久久| 国产无套在线观看| 懂色中文一区二区在线播放| 国产对白在线正在播放| 污视频在线观看免费网站| 国产一区二区三区影视| 大桥未久一区二区三区| 狠狠色狠狠色综合日日五| 肉色超薄丝袜脚交一区二区| 欧美日韩国产中文精品字幕自在自线| 黄色美女久久久| 精品免费囯产一区二区三区| 四虎国产精品成人免费4hu| 91麻豆精品国产91久久久资源速度| 亚洲第一二区| 亚洲综合久久av| 尤物精品在线| 国产精品美女www爽爽爽| 国产亚洲成av人在线观看导航| 亚洲999一在线观看www| 日本乱人伦aⅴ精品| 日本中文字幕不卡| 亚洲视频一区二区| 国产精品日日摸夜夜摸av| 欧美午夜精品| 国产成人精品午夜视频免费| 国产拍精品一二三| 大桥未久av一区二区三区中文| 91精品视频网| 在线日韩精品视频| 国产亚洲一级| 亚洲大尺度在线观看| 91原色影院| 天天干天天玩天天操| 人人狠狠综合久久亚洲婷| 一本到高清视频免费精品| 天堂网在线免费观看| 亚洲自拍偷拍一区二区三区| 欧美一区永久视频免费观看| 91精品国产乱码久久蜜臀| 蜜臀av在线播放| 亚洲成a人v欧美综合天堂下载| 中文字幕一区在线| 国产男女猛烈无遮挡免费视频| 国产中文字幕网| 亚洲一区二区在线视频观看| 亚洲精品国产一区黑色丝袜| 公共露出暴露狂另类av| 亚洲精品97久久中文字幕无码| 日韩电影精品| 亚洲九九在线| 欧美h片在线观看| 日韩av理论片| 日韩精品一线二线三线| 欧洲精品一区| 免费黄色网页| 91香蕉视频污| 成人黄色片在线观看| 中文字幕在线观看网站| 色se01短视频永久免费| 嫩草影院官网| 95影院理论片在线观看| 精品亚洲国内自在自线福利| 18欧美乱大交| 五月天激情视频在线观看| 精品视频一区二区观看| 欧美日韩一区综合| 任你操这里只有精品| 一个色在线综合| 久久久亚洲人| 欧美国产成人精品一区二区三区| 美女做暖暖视频免费在线观看全部网址91| 亚洲欧美中文字幕在线观看| 成人黄色片在线观看| 欧美激情精品久久久久久大尺度| 亚洲性猛交xxxx乱大交| 先锋成人影音| 成人不卡视频| 国产精品久久久久久久电影| 国产一区二区主播在线| 欧美三级中文字幕在线观看| 欧美精品123区| www.4hu95.com四虎| va亚洲va日韩不卡在线观看| 日本在线观看免费视频| 动漫av免费观看| 91theporn国产在线观看| 国产私人尤物无码不卡| 三级在线观看免费大全| 欧美一区二区三区……| 久久婷婷综合色| 日韩欧美一区二区三区久久婷婷| 亚洲啪啪aⅴ一区二区三区9色| 国产女人高潮的av毛片| 欧美天堂在线| 日本天堂在线观看| 天天色天天综合| 99视频网站| 色偷偷色偷偷色偷偷在线视频| 日韩成人免费在线观看| 国产99在线播放| 国产成人调教视频在线观看| 一区二区三区免费观看视频| 成人美女黄网站| 精品久久久久久久久久久国产字幕| 欧美韩日一区二区三区| 成人日日夜夜| 波多野结衣亚洲一区二区| 精品福利二区三区| 男人日女人网站| 成人精品视频99在线观看免费| 拍拍拍在线观看视频免费| www.噜噜色.com| 综合久久一区| 少妇人妻互换不带套| 午夜福利一区二区三区| 国产乱码精品一区二区三区四区| 国产一区二区你懂的| 欧美视频自拍偷拍| 欧美一区二区三区视频免费播放| 亚洲欧美在线人成swag| 亚洲一区亚洲二区亚洲三区| 国产精品视频自在线| 97精品欧美一区二区三区| 亚洲国产精品精华液2区45| 久久久久久久蜜桃| 三区四区在线观看| 性欧美超级视频| 紧缚奴在线一区二区三区| 乱子伦视频在线看| 国产suv精品一区二区三区| 老牛影视av一区二区在线观看| 九色在线观看视频| 四虎精品在线| 亚洲高潮无码久久| avlululu| 国产精品久久久久久久成人午夜| 在线观看免费版| 国产亚洲一区在线| 成人免费播放视频| 亚洲区小说区图片区qvod| 久久精品国产v日韩v亚洲| 蜜桃91麻豆精品一二三区| 日韩免费性生活视频播放| 91国偷自产一区二区三区的观看方式| 超碰影院在线| 亚洲天堂网一区| 精品日本高清在线播放| 婷婷亚洲综合| 97av在线视频| 成人夜色视频网站在线观看| 一区二区在线观看免费| 最近中文字幕一区二区三区| 在线观看涩涩| 免费日韩成人| 日本丰满大乳奶| 欧美电影免费提供在线观看| 国产美女久久精品香蕉69| 日韩xxxxxxxxx| 欧美xxxhd| 亚欧洲精品在线视频免费观看| 精品一区二区视频| 国内自拍中文字幕| 国产一级在线免费观看| 亚洲视频狠狠| 国产又粗又爽视频| 午夜一区二区三视频在线观看| 日韩极品视频在线观看| 午夜剧场日韩| 亚洲熟女少妇一区二区| 一本一道久久a久久精品蜜桃| 日本黄区免费视频观看| 成人美女av在线直播| 精品伊人久久97| 成年网站免费入口在线观看| av在线免费在线观看| 极品美女一区二区三区视频| 成人激情电影在线看| 日本一区免费| 激情欧美丁香| 成人精品鲁一区一区二区| 久久影院午夜精品| 亚洲77777| 99精品国产一区二区三区不卡| 一道本一区二区三区| 国产精品羞羞答答在线| 精品爽片免费看久久| 国产福利一区二区| 国产美女精品一区二区三区| 国产又粗又猛又黄| 天天操天天操天天操天天| 午夜影视一区二区三区| 4438国产精品一区二区| 国产精品88888| 亚洲精品欧美日韩| 欧美亚洲激情视频| а√中文在线8| 日韩免费观看高清完整版在线观看| xvideos成人免费中文版| 第一页在线视频| 一区二区三区免费观看视频| 欧美多人猛交狂配| a看欧美黄色女同性恋| 伊人久久在线| 少妇精品视频一区二区| 欧美激情精品久久久久久| 99久久综合狠狠综合久久止| 国产高清免费在线| 国产精品极品美女粉嫩高清在线| 美女视频一区二区三区在线| 成人深夜视频在线观看| 欧美黑人又粗大| 亚洲欧美日韩国产成人综合一二三区| 日韩精品欧美专区| 国产老肥熟xxxx在线观看| 国产鲁鲁视频在线观看特色| 色偷偷成人一区二区三区91| www.狠狠插| 96sao精品免费视频观看| 国产毛片在线看| 欧美日韩另类国产亚洲欧美一级| 青青青手机在线视频| 国产l精品国产亚洲区在线观看| 日韩在线播放一区| 日韩视频在线一区二区三区| 日本精品免费在线观看| 日韩免费av电影| 好吊色一区二区| 91精品国产综合久久久久久久久久| 一二三四在线视频观看社区| 黄色一级二级三级| а_天堂中文在线| 欧美久久在线观看| 欧美韩一区二区| 欧美人与性动交xxⅹxx| 亚洲一区二区三区毛片| 欧美理论片在线观看| 国内成+人亚洲+欧美+综合在线| 色视频www在线播放国产成人| 欧美性生活大片视频| 国精品无码人妻一区二区三区| 欧美女人交a| 狠狠躁夜夜躁人人爽视频| 日韩欧美国产小视频| 亚洲成人999| 久久精品一二三| 少妇被狂c下部羞羞漫画| 中文字幕在线观看视频免费| 里番在线观看网站| 亚洲五码在线观看视频| 国产精品久久久久久影视| 69国产精品| 欧美日韩黄色大片| 丁香激情综合国产| 91久久人澡人人添人人爽欧美| 91麻豆精品国产91久久久久| 美国av免费观看| 亚洲三级在线免费| 日本在线视频观看| 成人激情五月天| 亚洲老司机av| 懂色aⅴ精品一区二区三区蜜月| 久久爱91午夜羞羞| 91九色91蝌蚪| 91久久久久久国产精品| 少妇人妻互换不带套| 2023国产精品久久久精品双| 欧美成人三级在线观看| 欧美午夜理伦三级在线观看| 精品国产三级a∨在线| 成人免费网视频| 日韩黄色一级视频| 欧美成人xxxxx| 日韩高清dvd| 极品魔鬼身材女神啪啪精品| 欧美视频免费| 在线观看精品| 国产美女永久无遮挡| 亚洲成人av一区| 日本在线免费观看| 色综合天天狠狠| 中文字幕 久热精品 视频在线| 久久久91视频| 国产精品久久天天影视| 日本中文字幕在线视频| 日韩电影一二三区| 欧美极品videos大乳护士| 日韩一二三区视频| 国产1区2区视频| 色综合久久中文综合久久牛| 三大队在线观看| 猫咪在线永久网站| 欧美亚洲激情视频| 国产视频精品在线| 国产十八熟妇av成人一区| 性欧美大战久久久久久久| 国产大学生校花援交在线播放| 久久天天综合| 国产同性人妖ts口直男| 国精产品一区一区三区免费视频| 在线观看免费播放网址成人| 97久久超碰国产精品电影| 国产欧美va欧美va香蕉在| 国产精品115| 亚洲视频一区二区| 亚洲黄色片免费看| 亚洲一区二区免费在线| 欧美激情a∨在线视频播放| 亚洲一卡二卡三卡四卡| 国产一卡不卡| 在线中文字幕第一区| 波多野结衣在线观看一区二区三区| 国产一区二区av| 日韩一级毛片| 久久精品视频在线观看榴莲视频| 午夜小视频在线观看| 国产精品无码久久久久久| 日韩激情av| www.麻豆av.com|