一、功能填坑(一)
1.1 开发的时候小便利
1.2 【角色添加】----在(六)中我们做到了权限添加from表单做出来了,现在我们来完成这个半成品,做到保存
- 在jQueryEasyUI文档中有传递额外参数的 代码 搞过来先参考一下
1.2.1 拿到选中的所有权限
1.2.2 遍历成咋门想要的格式(上面图片)
1.2.3 整体和在一起就是这样,几句而已
//提交表单前的方法
onSubmit: function (param) {
//1.拿到选中的所有权限
var rows = myPermissionDatagrid.datagrid("getRows");
//2.遍历这些权限,拼接成想要格式
for (var i = 0; i < rows.length; i++){
//3。拿到每一个数据的值
var row = rows[i];
//4,拼接相应的结构
param[`permissions[${i}].id`] = row.id;
}
return $(this).form('validate');
},
1.3 我们role权限添加完之后再点添加 ,from并未清空
- easyuiAPI中有 在js-add中填上这一句就是清空
myPermissionDatagrid.datagrid("loadData",[]);
1.4 权限修改回显
- js-edit中添上一句 【位置要放到最下面 好一些--有时候渲染会没跟上】
回显grid中响应的数据myPermissionDatagrid.datagrid("loadData",row.permissions);
1.5 BUG现在我们权限修改回显的问题
- 出现原因
复制一个permission(解决修改是原来哪一个行数据的问题
复制一个permission:var parms = [...row.permissions];
添加到js修改里
1.6 BUG权限修改解决
错误问题:
当我们在权限页面,点击修的时候,这个时候回显已经搞定了,当我们添加两个权限并保存之后,关闭,再次打开时,我们删除掉刚刚加的权限保存后,并未删除点,我们删除原始的两个权限。直接报错n-to-n原因:
现在只会出现覆盖,并不是删除。所以删除新加的,因为是覆盖 ,所以并未删除。我们删除原始权限时,也是覆盖,修改持久化id等 就会出n-to-n
//在任何方法前执行
@ModelAttribute("editRole")
public Role beforeEdit(Long id,String cmd){
//cmd就是让他可以准确的找到update 不要所有都找影响性能
if (id != null && "update".equals(cmd)){
Role editRole = roleService.getOne(id);
editRole.getPermissions().clear();
return editRole;
}
return null;
}
二、主页面
2.1 main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%@include file="head.jsp"%>
<%--表头。名称。尾部注销功能--%>
<%--title:'center title' 加名字--%>
<%--菜单栏--%>
2.2 MainController
package cn.zx.aisell.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainController {
@RequestMapping("/main")
public String index(){
return "/main";
}
}
- 注:记住登录之后调到新建的main主页面。修改路径
三、菜单栏
- 这里先不搞了 ,在(八)里面在搞,现在先写死
四、主页面当前用户显示、注销功能
4.1 显示用户
1.2.1 在LoginController最后在返回前添加
//现在要做的就是返回JSON
Employee employee = (Employee)subject.getPrincipal();//获取当前登录用户
Session session = subject.getSession();//拿到Seesion对象
session.setAttribute("employee",employee );//把用户方法放session中
return new JsonResult();
1.2.1 使用shiro标签实现同样功能
4.2 注销
4.2.1 在main.jsp主页面添加
<%--在你想要放的地方加a标签,搞上路径--%>
滚吧
4.2.2 在LoginCtroller添加方法
//注销
@RequestMapping("/logout")
public String logout(){
Subject currentUser = SecurityUtils.getSubject();
currentUser.logout();
return "redirect:/login";//跳回登录页面
}
五、权限判断
目前Shiro权限框架中,密码学、身份认证还有会话管理 都已经搞定了,但是授权还没有做,还是写死的状态。
5.1 需要对应权限才可访问设置----【PermissionMapFactory】
//注入一下
@Autowired
private IPermissionService permissionService;
//1.拿到对应的权限才可以访问(的地方修改)
List all = permissionService.getAll();
//2,遍历然后把值放进去
for (Permission permission : all){
//perms 这个会自动判断找一个过滤器
permissionMap.put(permission.getUrl(),"aisellPerms["+permission.getSn()+"]" );
}
5.2 自定义Realm中,把权限改成从数据库中获取
5.2.1 五表关联查sn权限
SELECT DISTINCT p.sn FROM employee e JOIN employee_role er ON er.employee_id = e.id JOIN role r ON r.id = er.role_id JOIN role_permission rp ON rp.role_id = r.id JOIN permission p ON p.id = rp.permission_id WHERE e.id = 1
5.2.2 连接数据库 --- 【PermissionRepository】
/*
根据用户的id去拿权限
1.不要手动去迪卡尔积2.关联对象 别名.属性
*/
@Query("select distinct p.sn from Employee o join o.roles r join r.permissions p where o.id=?1")
Set findPermsByUserId(Long userId);
5.2.1 IPermissionService--- 加---Set findPermsByUserId(Long userId);
5.2.1 PermissionServiceImpl
@Autowired
private PermissionRepository permissionRepository;
@Override
public Set findPermsByUserId(Long userId) {
return permissionRepository.findPermsByUserId(userId);
}
5.2.1 自定义realm---【AisellRealm】
//注入
@Autowired
private IPermissionService permissionService;
在授权中修改死代码
//2.根据主体拿到数据库的角色和权限 。(现在在下面拿 因为源码是要返回Set)
Set perms = permissionService.findPermsByUserId(loginUser.getId());
5.3 当你有员工权限的时候,并没有增删改的权限时会报错。
5.3.1 报错原因
- 添加和修改的时候不会出这种问题,但是删除的时候就会出现原因如下---【Ajax请求和普通请求不一样】
5.3.1 解决方案
判断是否是Ajax请求
1.如果不是:直接跳转(代码不需要改)
2.如果是:返回JSON数据!!
我们怎么知道请求是什么请求?
我们应该怎么取修改?
-
我们需要自定义权限拦截器了---可百度
5.4 在Shiro中新写PermissionsAuthorizationFilter ----当没有权限的收会进到这里来,这里写没有权限的处理方案
5.5 配置自定义权限拦截器----【applicationController-shiro.xml】修改一下过滤器
5.7 PermissionsMapFactory
//1.拿到对应的权限才可以访问
List all = permissionService.getAll();
//2,遍历然后把值放进去
for (Permission permission : all){
//perms 这个会自动判断找一个过滤器
permissionMap.put(permission.getUrl(),"aisellPerms["+permission.getSn()+"]" );
}
六、你没有权限就直接看不见增删改的按钮!!!啊---直接快速解决上面问题【但是自定义拦截器还是很重要的。要学会啊~~~】因为现在使用的jsp。万一以后不用呢?所以上面也要会比这个重要
在js中加shiro标签
在加一句
七、知识点
JPQL关联
1.不需要手动消除迪卡尔积
2.关联的是前面的对象的别名.属性
比如现在关联员工和部门select o from Employee o join o.department
报错401
就是你没有填权限