美文网首页
Spring Boot入门(第二十章):用户角色权限(中)

Spring Boot入门(第二十章):用户角色权限(中)

作者: 苍_之涛 | 来源:发表于2020-04-11 19:11 被阅读0次

    上节我们基本上完成了用户角色权限的后台服务,这节我们主要来完成页面上的操作。在开始这节内容时,先补充下上节Controller里面漏掉的一些内容。

    0、增加方法

    上节我们的User,Role,Perm对应的Controller,里面漏掉了新增页面和编辑页面的导航方法,这里我们先将漏掉的方法加上,下面将会用到的。三个类做相对应的修改

    1、权限页面

    我们从最简单的权限列表开始,我们将原来的文章列表页面复制一份

    修改成下面这样

    测试页面:

    我们再将文章新增页面复制一份到perm文件夹

    测试新增

    我们再复制文章编辑页面到perm文件夹

    测试编辑

    这时我们测试,发现修改了内容,提交后,内容又还原了。

    原来是我们当初在Controller里面留了一段代码还没实现

    这里有个常见的错误做法,就是直接把前端传过来的perm保存在数据库里面,即直接permRepository.save(perm),这样做是有问题的,因为前端传过来的数据,都存在危险,是不可信的,假设我们Perm的name是不可修改的(这种场景,很多,例如用户的用户名是不能修改的),如果你直接保存perm,就可能导致Perm的name被篡改。有人说,我页面上设置了name是不可编辑的啊,但是对于稍微有点经验的程序员来说,完全可以伪造请求,直接使用postman就可以完成name的篡改。又有人说,那我对perm对象的值进行检查不就ok了,确实如此,但我们再考虑另外一个场景,假设这个权限编辑页面,并没有提供description这个字段的展现,前端的表单也没有description字段,这样提交过来的perm的description就是null,这时直接保存perm,就会将原来的description值设置成null,这个结果是用户真正期望的吗?所以,笔者的经验是,先查出原来的对象,然后按照需要从前端传过来的对象取值赋给原来的对象。

    假设这里perm的name是不可编辑的,我们就可以这样处理

    这样,你的name就绝对不可能被篡改。

    删除很简单,我们直接点删除按钮,就可以发现记录被正常删除了。

    2、角色页面

    我们现在将权限列表页面复制一份,作为我们的角色列表页面,将权限新增页面复制一份作为角色新增页面,我们暂时先不考虑perms属性。当我们测试完角色新增,返回列表页面时,发现后台报错

    2020-04-11 10:32:48.175  WARN 94575 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: write javaBean error, fastjson version 1.2.58, class org.springframework.data.domain.PageImpl, failed to lazily initialize a collection of role: com.cangzhitao.springboot.study.security.entities.Role.perms, could not initialize proxy - no Session; nested exception iscom.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.58, class org.springframework.data.domain.PageImpl, failed to lazily initialize a collection of role: com.cangzhitao.springboot.study.security.entities.Role.perms, could not initialize proxy - no Session]

    这就是“著名”的延迟加载异常,我们后台方法返回的是结果是使用fastjson序列化成字符串到前端的,fastjson序列化Role里面的perms属性的时候,触发了JPA的延迟加载机制,JPA的延迟加载机制将会去数据库查询关联数据,但这时候我们的session已经关闭了。

    解决这个方法有两个,一个是将Lazy改为EAGER,即不使用延迟加载,再一个就是延迟session关闭的时间,其实我们之前配置文件中的spring.jpa.open-in-view: true就是做这个事的。但是为什么我们还会报这个错呢,原来现在我们还需要设置enable_lazy_load_no_trans属性

    这样我们的程序可以正常运行了。

    我们继续完成编辑页面。

    3、用户页面

    用户页面和就是页面基本一致,我们也暂时先不考虑里面的roles属性,先完成基本属性的增删改查。这里就不贴出代码了。

    4、总结

    这节主要完成前端页面的编写,暂时我们只处理了基本属性,像User对象里面的roles属性,Role对象里面的perms属性,我们暂时都略过了,下节我们来完善这两个属性的处理。

    代码:

    https://github.com/www15119258/springboot-study/tree/branch20

    相关文章

      网友评论

          本文标题:Spring Boot入门(第二十章):用户角色权限(中)

          本文链接:https://www.haomeiwen.com/subject/cibemhtx.html