shiro_项目_登录与权限验证

1 Shiro登录

登录流程:

  1. 准备一个登录界面login.jsp
  2. 点击登录的时候,向后台传递用户名和密码
    Controller层
  3. 接受参数
  4. 完成登录认证
//post进入该方法
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ResponseBody
public JsonResult login(String username, String password){
    //主体
    Subject subject = SecurityUtils.getSubject();
    //判断该主体是否已经认证过
    if (!subject.isAuthenticated()) {
        try {
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            subject.login(token);
        }catch (UnknownAccountException uae) {
            return new JsonResult(false, "账号错误");
        } catch (IncorrectCredentialsException ice) {
            return new JsonResult(false, "密码错误");
        } catch (LockedAccountException lae) {
            return new JsonResult(false, "这个账号已经被锁定");
        }catch (AuthenticationException ae) {
            return new JsonResult(false, "其他认证错误");
        }
    }
    return new JsonResult();
}

2 完成登录认证时提交form表单

//登录方法
function submitForm() {
    //提交表单
    $("#loginForm").form("submit",{
       url:"/login",
       success:function (data) {
           //返回字符串
          var jsonObj =  $.parseJSON(data);
           if (jsonObj.success){
               //进入页面
               location.href="/main";
           }else {
               $.messager.alert("温馨提示:","登录失败:" + jsonObj.msg,"error");
           }

       }
    });
}

3 增加方法—按回车键提交到后台

//按回车登录  绑定键盘事件
$(document.documentElement).on("keyup", function(event) {
    //event 键盘事件的对象
    if(event.keyCode == 13){
        submitForm();
    }
});

4 重置表单里面的内容

function resetForm() {
    $("#loginForm").form("clear");
}

5 注销用户功能

前台显示

<div style="float:right;margin-right: 20px; ">
    欢迎[<shiro:principal />]登录,
    <a href="${pageContext.request.contextPath}/logout">退出</a>
</div>

后台方法跳转

//注销
@RequestMapping("/logout")
public String logout(){
    Subject subject = SecurityUtils.getSubject();
    subject.logout();
    return "forward:/WEB-INF/views/login.jsp";
}

6 解决登录过期

//判断当前窗口是否是顶层窗口
if(top != window){
    window.top.location.href = window.location.href;
}

7 权限

7.1 角色用户显示所有权限

在这里插入图片描述

function formatperms(arr) {
    var persStr = "";
    for (var i = 0; i < arr.length; i++) {
        var obj = arr[i];
        if (i != arr.length - 1) {
            persStr += obj.name + ",";
        } else {
            persStr += obj.name;
        }
    }
    return persStr;
}

7.2 初始化表格数据

在这里插入图片描述

//初始化表格
//我们在这里创建两个Grid
//创建当前角色的权限Grid
userPermissionGrid.datagrid({
    fit:true,
    fixed:true,
    fitColumns:true,
    rownumbers:true ,
    //双击后移除权限
    onDblClickRow:itsource["removePermission"]
})

//获取所有权限的Grid
allPermissionGrid.datagrid({
    fit:true,
    fixed:true,
    fitColumns:true,
    singleSelect:true,
    url:"/permission/page",
    rownumbers:true ,
    pagination:true,
    //双击后添加权限
    onDblClickRow:itsource["addPermissions"]
})
addPermissions:function (index,row) {
 //双击添加权限
  //把选中的数据  添加到左边的表格中去
  //重复的数据不要添加
  var allrows = userPermissionGrid.datagrid("getRows");
  for (var i = 0; i <allrows.length ; i++) {
      var rowData = allrows[i];
      if (rowData.id == row.id){
          //重复
          $.messager.show({
              title:'提示',
              msg:'该权限已经添加!',
              timeout:2000,
              showType:'slide'
          });
          return;
      }
  }
  userPermissionGrid.datagrid('appendRow',row);
},
removePermission:function (rowIndex, row) {
  //移除数据
  userPermissionGrid.datagrid("deleteRow",rowIndex);
}

7.3 修改回显表格数据

edit:function(){
//选择一条数据进行修改
var row = roleGrid.datagrid('getSelected');
if(row){
    //弹出对话框
    roleDialog.dialog('center').dialog('open');
    //清空表格数据
    userPermissionGrid.datagrid("loadData",[]);
    //修改 -- 回显示数据
    roleForm.form('load',row);
    //回显表格里面的数据
    var tempPermissions = [];
    $.extend(tempPermissions,row.permissions);
    //夹杂到表格里面
    userPermissionGrid.datagrid("loadData",tempPermissions);
}else{
    //提示用户
    $.messager.alert('温馨提示:','请选中一条数据进行修改','info');
    return;
}

注意:
每次经过RequestMapping这些请求的时候,都要执行改方法
如果在修改保存的时候,先在改方法里面查询出数据库Role对象
查询出来 (headImage) 和 当前save(Role role)会进行比对
会把接收数据 去覆盖查询出来数据 。–提交我最终之后的数据
脏数据:一个持久化状态的数据修改非主键的值,在提交的时候会自动更新
如果修改主键值,就会报n-to-n 解决 在修改的时候的时候,关联对象设置null

@ModelAttribute("editRole")
public Role beforeEdit(Long id,String cmd){
    Role role = null;
    if("update".equals(cmd) && id != null && !"".equals(id) ){
        role = roleService.findOne(id);
        //就住这就话:在修改的时候的时候,关联对象设置null,保永生
        role.setPermissions(null);
    }
    return role;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值