CRUDの史郎ログインと承認

1ログイン-shiro認証

1.1データベースのパスワードを変更する - それが暗号化されています

私たちは、変化にパスワードデータベースの必要性を知りません

アイデア:

メソッド上書き保存

  @Test
  public void testMD5()throws Exception{
      List<Employee> employees = employeeRepository.findAll();
      for (Employee employee : employees) {
          employee.setPassword(MD5Util.createMd5Str(employee.getUsername()));
          employeeRepository.save(employee);
      }
  }

1.2新しいユーザーのパスワードは暗号化されなければなりません

@Override
    public void save(Employee employee) {
        if(employee.getId() == null){
            //对员工设置加密之后的密码
            employee.setPassword(MD5Util.createMd5Str(employee.getPassword()));
        }
       //重新保存到数据库 新增或者修改都要调用
        super.save(employee);
    }

1.3ログインページを追加します。

(1)ランディングページlogin.jspをを調製

(2)login.jspページは、フォームのフォームを提供します

(3)提出する以下を呼び出して、ログインフォームを送信します

function submitForm(){
            //提交表单到后台程序
            $("#loginForm").form('submit',{
                url:'/login',
                success:function(result){
                    //返回json字符串 {success:true,msg:'xxx'}
                    //$ jquery里面对象
                    result = $.parseJSON(result);
                    if(result.success){
                      //跳转主页对外暴露资源名
                        location.href = "/main";
                    }else{
                        $.messager.alert("温馨提示", result.msg, "info");
                    }
                }
            })

        }

(4)LoginControllerログイン認証プロセス

  //get方式提交   
  /*当你访问当前服务器的资源的时候默认访问 对外的暴露资源 lojin 此时没有携带参数就是get提交
      直接跳转到登录界面
  */
    @RequestMapping(value="/login",method = RequestMethod.GET)
    public String login(){

        System.out.println("京来啦");
        // 返回登陆界面
        return "login";
    }

    // 进入登陆界面后输入用户名和密码再提交就是post提交
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @ResponseBody
    public AjaxResult login(String username,String password){
        //得到主体(用户名)
        Subject subject = SecurityUtils.getSubject();
        System.out.println(subject);
        //判断主体是否认证过若是没有认证过则
        if(!subject.isAuthenticated()){
            //认证 用户名和密码的令牌
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            try {
                //调用认证方法 该方法会调用到myrealm里面
                subject.login(token);
            } catch (UnknownAccountException e) {
                e.printStackTrace();
                System.out.println("用户不存在");
                return new AjaxResult("用户不存在");
            } catch (IncorrectCredentialsException e) {
                e.printStackTrace();
                System.out.println("密码不正确");
               return new AjaxResult("密码不正确");

            }catch (AuthenticationException e) {
                e.printStackTrace();
                System.out.println("其他认证异常");
              return   new AjaxResult("其他认证异常");
            }
        }
 
        return new AjaxResult();
    }

1.4ログアウト機能

ログアウト機能を追加するには、ログインした後、(1)メインメニュー

<div data-options="region:'north',split:true" style="height:120px;">
        <h1 style="margin-bottom: 10px">源码时代智销系统</h1>
        <div style="text-align:right;margin-right: 10px">
             欢迎<font color="red"><shiro:principal property="username"/></font>进入
            <a href="/logout">注销</a>
        </div>
    </div>

(2)LoginControllerの登録方法を提供すること

  @RequestMapping("/logout")
        public  String  logout(){
            // 从前台传过来的获取主体
            Subject subject = SecurityUtils.getSubject();
            // System.out.println(subject);
            // 注销方法shiro自动注销登录
            subject.logout();
            // 重定向到登录页面 对外的暴露资源名
            return  "redirect:/login";


        }

ログイン1.5を入力します。

入ることが検出された場合はイベントページバインドキーボードでは、フォームを送信する(キーを入力してください)

$(document.documentElement).on("keyup", function(event) {
        
            //console.debug(event.keyCode);
            //获取你再键盘上面点击了按键
            var keyCode = event.keyCode;
            console.debug(keyCode);
            if(keyCode===13){
            //注册键盘事件之后 当判断为回车键的时候(回车键就是编号为13)还是掉用点击事件的方法一样的
                submitForm();
            }
        });

1.6ログインの問題が期限切れ

理由:私たちは、システムをオフに書かれていた場合は、他のページ内のクリックすると、ネストされたログインページが存在します

解決策:ウィンドウアドレスの先頭に割り当てられた子ウィンドウのページアドレスをしてみましょう

 if(top!=window){
            //子窗口  把当前子窗口的路径 赋值顶层窗口的路径
            top.location.href = window.location.href;
        }

2権限 - 許可(難易度)

2.1なぜあなたは承認が必要です

セキュリティ

2.2認可は複数のオブジェクトを含み、

ユーザー:普通の人々

役割:権利グループ

権限:リソースがロックされています

リソース:特定のコンテンツ

2.3オブジェクト・リレーショナル

従業員ロール権限

ユーザーと役割 - 多くの関係

役割と権限:多くの関係

権限と資源:1から1

関係の設定を構成するには、ドメインオブジェクト--Employeeロール権限を作成し、

リポジトリ層を書きます

書き込みサービス層

書き込み制御層

2.4ロールのページ表示

注:権限の文字列処理

function permissionsFormat(obj){
    if(obj!=null){
        var permissionStr = "";
        //循环数组  0 1
        for(var key in obj){
            //取出每一个权限
            var permission = obj[key];
            
            if(key <= obj.length-2) {
                //拼接成字符串 最终展示到页面  +=叼的很
                permissionStr += permission.name + ",";
            }else{
            //若是最后一条数据就不需要加上逗号所以数组的长度-2
                permissionStr += permission.name;
            }
        }
        // 返回拼接后的字符串
        return permissionStr;
    }
}

追加の役割2.5インターフェース

準備完了]ダイアログボックス

レディーフォームテーブル

2つのテーブルを準備します

機能を追加するページの2.6役割

イベントテーブルをダブルクリックします

  allPermissionGrid.datagrid({
        fit:true, //自适应div窗口
        fixed:true,//固定列
        fitColumns:true,//自适应列
        url:"/permission/page",//查询所有的权限
        rownumbers:"true" ,//显示行号
        pagination:"true",//分页
        //双击后添加权限
        onDblClickRow:itsource.addPermission

    });

フォームは、データの行を追加します

  userPermissionGrid.datagrid('appendRow',row);

データテーブルの行を削除します

userPermissionGrid.datagrid('deleteRow',index);

エコー操作

 roleDialog.dialog('center').dialog('open');
                //回显数据
                roleForm.form('load',row);
                //回显表格数据
                var permssions = row.permissions;
          
                //用户已选择权限的表格
               // userPermissionGrid.datagrid('loadData',permssions);
                var permissions = [];//准备一个临时的数组变量
                $.extend(permissions,row.permissions);//把表格的权限数据复制到临时数组变量
                userPermissionGrid.datagrid("loadData",permissions);
            }else{
                $.messager.alert('提示信息','请选中一条数据进行修改',"info");
            }

時間を節約するために追加のパラメータを送信

onSubmit: function(param){
                    //param提交--表格里面的数据 --
                    //private List<Permission> permissions = new ArrayList<>();
                    //获取到表格里面的数据
                    var rows = userPermissionGrid.datagrid('getRows');
                    for(var i=0;i<rows.length;i++){
                        var rowObj = rows[i];
                        param["permissions["+i+"].id"]=rowObj.id;
                    }
                    //重复密码验证 比较两个值是否相等 如果不相等 return false
                    //表示验证通过才能提交
                    return roleForm.form("validate");
                }

n対nの問題を解決します

  role.getPermissions().clear();
公開された23元の記事 ウォンの賞賛2 ビュー935

おすすめ

転載: blog.csdn.net/metjoyful/article/details/102465495
おすすめ