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();