一、功能填坑(一)
1.1 开发的时候小便利
在login.jsp中填上,这样我们再次测试时,到登陆页面时账号和密码就是在上面的直接登录就可以,会节约很多时间。记得上线前删掉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" %>
<html>
<head>
<title>Title</title>
<%@include file="head.jsp"%>
</head>
<body class="easyui-layout" >
<%--表头。名称。尾部注销功能--%>
<div data-options="region:'north'" style="height:100px;">
<%--split:true --- 是否可拖动--%>
<h1>浪里个张的智能销售系统</h1>
<div style="text-align: right; margin-right: 20px">
欢迎${employee.username}您老大驾光临!!
<img src="${employee.headImage}" height="4px" width="4px"/>
<a href="/logout">滚吧</a>
<a href="center">修改密码</a>
</div>
</div>
<div data-options="region:'west',title:'菜单'" style="width:135px;">
<ul id = "menuTree"></ul>
</div>
<%--title:'center title' 加名字--%>
<div id="mainTab" class="easyui-tabs" data-options="region:'center'" style="background:#eee;">
<div title="首页" style="padding: 20px;display:none;">
<%--<h1>来啦老弟</h1>--%>
<div><img src="images/head/7.jpg" width="100%" height="100%"></div>
</div>
</div>
<%--菜单栏--%>
<script>
$(function () {
$('#menuTree').tree({
url:'/json/menu.json',
//node:点击的那个节点所有信息
onClick:function (node) {
var titleName = node.text;//定义标题名称
var url = node.url;//跳转路径
//父菜单没有地址url。有地址就是子菜单,才需要进行面板的打开 判断一下
//有路径才可以打开选项卡
if(url){
//根据名称判断这个页面是否存在,已经打开的选项卡不可再打开。
if($('#mainTab').tabs("getTab",titleName)){
//如果存在就选中相应面板--- 选中已出现的
$("#mainTab").tabs("select",titleName)
}else{
//如果没有直接打卡一个选项卡
$('#mainTab').tabs('add',{
title:titleName, //标题名称
//iframe --- 可以嵌入任何页面
content: '<iframe scrolling="auto" frameborder="0" width="100%" height="100%" src="'+url+'"></iframe>',
closable: true//是否可以关闭
});
}
}
}
})
})
</script>
</body>
</html>
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.png4.2 注销
4.2.1 在main.jsp主页面添加
<%--在你想要放的地方加a标签,搞上路径--%>
<a href="/logout">滚吧</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<Permission> 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<String> findPermsByUserId(Long userId);
5.2.1 IPermissionService--- 加---Set<String> findPermsByUserId(Long userId);
5.2.1 PermissionServiceImpl
@Autowired
private PermissionRepository permissionRepository;
@Override
public Set<String> findPermsByUserId(Long userId) {
return permissionRepository.findPermsByUserId(userId);
}
5.2.1 自定义realm---【AisellRealm】
//注入
@Autowired
private IPermissionService permissionService;
在授权中修改死代码
//2.根据主体拿到数据库的角色和权限 。(现在在下面拿 因为源码是要返回Set)
Set<String> 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】修改一下过滤器
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!--如果没有登录,就会调到这个路径(一般放登录页面)login[登录]-->
<property name="loginUrl" value="/login"/>
<!--登录成功进入的路径(一般放主页面)-->
<property name="successUrl" value="/main.jsp"/>
<!--没有权限的时候进入的页面(一般专门写一个提示没有权限的页面)-->
<property name="unauthorizedUrl" value="/login/unauthorized.jsp"/>
<property name="filters">
<map>
<entry value-ref="aisellPermsFiter" key="aisellPerms"/>
</map>
</property>
<!--这里需要Map-->
<property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"/>
</bean>
<!--配置自定义权限拦截器-->
<bean class="cn.zx.aisell.web.shiro.AisellPermissionsAuthorizationFilter" id="aisellPermsFiter"/>
5.7 PermissionsMapFactory
//1.拿到对应的权限才可以访问
List<Permission> all = permissionService.getAll();
//2,遍历然后把值放进去
for (Permission permission : all){
//perms 这个会自动判断找一个过滤器
permissionMap.put(permission.getUrl(),"aisellPerms["+permission.getSn()+"]" );
}
六、你没有权限就直接看不见增删改的按钮!!!啊---直接快速解决上面问题【但是自定义拦截器还是很重要的。要学会啊~~~】因为现在使用的jsp。万一以后不用呢?所以上面也要会比这个重要
在js中加shiro标签
<style type="text/css">
td[field="permissions"]>div{
overflow: hidden;
text-overflow: ellipsis;
}
td[field="permissions"]>div:hover{
overflow: visible;
}
</style>
在加一句
七、知识点
JPQL关联
1.不需要手动消除迪卡尔积
2.关联的是前面的对象的别名.属性
比如现在关联员工和部门select o from Employee o join o.department
报错401
就是你没有填权限
网友评论