day06-登录与角色

小功能实现:
1.iframe :页面嵌入
在这里插入图片描述
2. 注销:
在这里插入图片描述

  1. 过期处理
    在这里插入图片描述

  2. 回车登录
    在这里插入图片描述
    问题

  3. 权限显式
    在这里插入图片描述
    在这里插入图片描述
    2.双击方法,不能实现拿取选取行的数据,反而是name,url,sn
    在这里插入图片描述
    解决:方法应该onDblClickRow 而不是onDblClickCell
    在这里插入图片描述
    4.提交有数据,提交失败
    在这里插入图片描述
    解决:] 写错位置了
    在这里插入图片描述
    正确的
    在这里插入图片描述
    错误的
    一.登录1.1 准备登录页面(随便找一个即可)位置:webapp/WEB-INF/views/login.jspjs代码部分 //登录功能
    function submitForm(){
    $(’#loginForm’).form(‘submit’, {
    url:"/login",
    onSubmit: function(){
    return $(this).form(‘validate’);
    },
    success:function(data){
    var result = JSON.parse(data);
    if(result.success){
    //成功后跳转到主页面
    window.location.href = “/main”;
    }else{
    $.messager.alert(“提示”,result.msg,“error”);
    }
    }
    });
    }
    1.2 LoginController功能1.2.1 两个login方法一个用于跳转(/login,get),一个用于登录(/login,post)@RequestMapping(value="/login",method = RequestMethod.GET)
    public String index(){
    return “login”;
    }

/**

  • 是一个Ajax的登录请求,它会返回{success:true/false,msg:xxx}

  • @return
    */
    @RequestMapping(value="/login",method = RequestMethod.POST)
    @ResponseBody
    public JsonResult login(String username, String password){

    }
    1.2.2完成登录的功能@RequestMapping(value="/login",method = RequestMethod.POST)
    @ResponseBody
    public JsonResult login(String username, String password){
    //1.拿到当前用户
    Subject currentUser = SecurityUtils.getSubject();
    //2.如果没有登录,进行登录
    if(!currentUser.isAuthenticated()){
    //3.准备令牌
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    //4.实现登录
    try {
    currentUser.login(token);
    } catch (UnknownAccountException e) {
    e.printStackTrace();
    return new JsonResult(false, “用户名不存在!”);
    } catch (IncorrectCredentialsException e) {
    e.printStackTrace();
    return new JsonResult(false, “账号或密码错误!”);
    } catch (AuthenticationException e) {
    e.printStackTrace();
    // System.out.println(“就是登录不了(请联系程序员…)”);
    return new JsonResult(false, “网络出错(联系管理员)!”);
    }
    }
    //登录成功成功令牌
    return new JsonResult();
    }
    1.3 登录细节1.3.1 数据库的密码设置要有一套自己的密码规则(md5,10次,盐值:itsource)a.MD5Utilpublic class MD5Util {

    public static final String SALT = “itsource”;
    public static final Integer HASHITERATIONS = 10;

    //密码加密
    public static String changePwd(String password){
    SimpleHash hash = new SimpleHash(“MD5”,password,SALT,HASHITERATIONS);
    return hash.toHex();
    }
    }
    b.添加用户密码加密controller或者service中都可以进行[我们选择service]@Override
    public void save(Employee employee) {
    if(employee.getId()==null){
    //添加功能就进行密码修改
    employee.setPassword(MD5Util.changePwd(employee.getPassword()));
    }
    employeeRepository.save(employee);
    }
    c.加密的判断必需和规则一致applicationContext-shiro.xml(编码方式与次数)

JpaRealm(加盐一致)//身份认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //1.拿用户名与密码 UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken; String username = token.getUsername(); //2.根据用户名拿到相应的对象 Employee loginUser = employeeService.findByUsername(username); if(loginUser==null){ return null; //如果用户用空代表用户名不存在 } String password = loginUser.getPassword(); //返回认证信息 //准备盐值 //传的第一个值就是主体(username名称做的主体) ByteSource salt = ByteSource.Util.bytes(MD5Util.SALT); SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,password,salt,getName()); return authenticationInfo; } 1.3.2 其它细节a.静态资源放行有些地方没有登录也可以直接使用(FilterChainDefinitionMapFactory)public Map

b.登录过期login.jsp// 检查自己是否是顶级页面
if (top != window) {// 如果不是顶级
//把子页面的地址,赋值给顶级页面显示
window.top.location.href = window.location.href;
}
c.回车登录login.jsp$(document.documentElement).on(“keyup”, function(event) {
//console.debug(event.keyCode);
var keyCode = event.keyCode;
console.debug(keyCode);
if (keyCode === 13) { // 捕获回车
submitForm(); // 提交表单
}
});
d.展示用户名与注销main.jsp<%@ taglib prefix=“shiro” uri=“http://shiro.apache.org/tags” %>

欢迎您,亲爱的用户: 注销
LoginController@RequestMapping("/logout") public String logout(){ Subject currentUser = SecurityUtils.getSubject(); currentUser.logout(); return "redirect:/login"; } 二.角色管理先使用代码生成器生成Role,Permission 设置多对多的关系//Employee @ManyToMany @JoinTable(name = "employee_role", joinColumns = @JoinColumn(name="employee_id"), inverseJoinColumns = @JoinColumn(name="role_id")) private Set roles = new HashSet<>(); //Role @ManyToMany @JoinTable(name="role_permission", joinColumns = @JoinColumn(name="role_id"), inverseJoinColumns = @JoinColumn(name="permission_id")) private List permissions = new ArrayList<>(); 2.1 角色中(权限的展示)role.jsp

2.1.3 只增不减的问题修改的时候只能添加不能减少@ModelAttribute(“editRole”)
public Role beforeEdit(Long id,String cmd){
//修改的时候才查询(只要有id会就进行一次查询,这是不对的)
if(id!=null && “update”.equals(cmd)) {
Role role = roleService.findOne(id);
//把要传过来的关联对象都清空,就可以解决n-to-n的问题
role.getPermissions().clear();
return role;
}
return null;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值