智能销售系统(七)小问题填坑/权限判断

一、功能填坑(一)

 1.1 开发的时候小便利

智能销售系统(七)小问题填坑/权限判断_第1张图片
在login.jsp中填上,这样我们再次测试时,到登陆页面时账号和密码就是在上面的直接登录就可以,会节约很多时间。记得上线前删掉

 1.2 【角色添加】----在(六)中我们做到了权限添加from表单做出来了,现在我们来完成这个半成品,做到保存

  • 在jQueryEasyUI文档中有传递额外参数的 代码 搞过来先参考一下
智能销售系统(七)小问题填坑/权限判断_第2张图片
SpringMVC会自动帮我们解析。以后只要是传List数据,都按这种写法
    1.2.1 拿到选中的所有权限
    1.2.2 遍历成咋门想要的格式(上面图片)
智能销售系统(七)小问题填坑/权限判断_第3张图片
    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现在我们权限修改回显的问题

智能销售系统(七)小问题填坑/权限判断_第4张图片
当你从左边添加到右边时,并不保存,直接关掉,再点开的时候却一起回显了
  • 出现原因
    复制一个permission(解决修改是原来哪一个行数据的问题
    复制一个permission:var parms = [...row.permissions];添加到js修改里

 1.6 BUG权限修改解决

  • 错误问题:
       当我们在权限页面,点击修的时候,这个时候回显已经搞定了,当我们添加两个权限并保存之后,关闭,再次打开时,我们删除掉刚刚加的权限保存后,并未删除点,我们删除原始的两个权限。直接报错n-to-n

  • 原因:
       现在只会出现覆盖,并不是删除。所以删除新加的,因为是覆盖 ,所以并未删除。我们删除原始权限时,也是覆盖,修改持久化id等 就会出n-to-n

在Controller中有一个永远执行在前面的代码,填上这一句就解决
    //在任何方法前执行
    @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"%>


    
        <%--表头。名称。尾部注销功能--%>
        
<%--split:true --- 是否可拖动--%>

浪里个张的智能销售系统

欢迎${employee.username}您老大驾光临!! 滚吧 修改密码
<%--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标签实现同样功能
image.png

 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张图片
权限关系连接草图
   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 当你有员工权限的时候,并没有增删改的权限时会报错。

智能销售系统(七)小问题填坑/权限判断_第6张图片
当你点击删除时,出现报错
   5.3.1 报错原因
  • 添加和修改的时候不会出这种问题,但是删除的时候就会出现原因如下---【Ajax请求和普通请求不一样】
智能销售系统(七)小问题填坑/权限判断_第7张图片
正常增修--普通请求
智能销售系统(七)小问题填坑/权限判断_第8张图片
删除流程图----Ajax请求
   5.3.1 解决方案

判断是否是Ajax请求
  1.如果不是:直接跳转(代码不需要改)
  2.如果是:返回JSON数据!!
我们怎么知道请求是什么请求?

普通请求
Ajax请求
智能销售系统(七)小问题填坑/权限判断_第9张图片

我们应该怎么取修改?

  • 我们需要自定义权限拦截器了---可百度


 5.4 在Shiro中新写PermissionsAuthorizationFilter ----当没有权限的收会进到这里来,这里写没有权限的处理方案

智能销售系统(七)小问题填坑/权限判断_第10张图片

 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

就是你没有填权限

你可能感兴趣的:(智能销售系统(七)小问题填坑/权限判断)