• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • wisdomsell-day6-登錄與角色

    1.準備一個加密算法

    public class MD5Util {
    //設置鹽值
    public static final String SALT = “wgl”;
    //設置遍歷次數
    public static final int HASHITERATIONS = 10;
    //傳入一個字符串,返回一個md5編碼的值
    public static String createMd5Str(String str) {
    //傳入的解碼的方式,密碼源,鹽加密方式,迭代次數
    SimpleHash hash = new SimpleHash(“MD5”, str, SALT, HASHITERATIONS);
    return hash.toString();
    }
    }

    2.通過算法改變數據庫的密碼

    @Override
    public void save(Employee employee) {
        if (employee.getId() == null) {
            //傳入id修改密碼
            employee.setPassword(MD5Util.createMd5Str(employee.getPassword()));
        }
        employeeRepository.save(employee);
    }
    **3.因為添加員工時必須加密所以重新寫一個員工保存**
       @Override
    public void save(Employee employee) {
        if (employee.getId() == null) {
            //傳入id修改密碼
            employee.setPassword(MD5Util.createMd5Str(employee.getPassword()));
        }
        employeeRepository.save(employee);
    }
    

    3.準備一個登陸頁面,配置xml和資源文件的訪問權限

    **xml**
    

    在這里插入圖片描述
    資源文件

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <!-- 登錄路徑:如果沒有登錄,就會跳到這里來 -->
        <property name="loginUrl" value="/login"/>
        <!-- 登錄成功后的跳轉路徑 -->
        <property name="successUrl" value="/main"/>
        <!-- 沒有權限跳轉的路徑 -->
        <property name="unauthorizedUrl" value="/s/unauthorized.jsp"/>
        <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"/>
        <!--引用自定義過濾器-->
        <property name="filters">
            <map>
                <entry key="wglPer" value-ref="wglPer"></entry>
            </map>
        </property>
    </bean>
    

    設置靜態資源放行
    通過一個map集合完成
    public class FilterChainDefinitionMapFactory {

    @Autowired
    private IPermissionService permissionService;
    
    public Map<String, String> builderFilterChainDefinitionMap() {
        //使用LinkedHashMap -> 保證是有順序的
        Map<String, String> maps = new LinkedHashMap<>();
        //在maps中加上數據
        //設置放行
        maps.put("/login", "anon");
        maps.put("*.js", "anon");
        maps.put("*.css", "anon");
        maps.put("/css/**", "anon");
        maps.put("/js/**", "anon");
        maps.put("/img/**", "anon");
        maps.put("/easyui/**", "anon");
        maps.put("/images/**", "anon");
        //1.拿到所有權限
        List<Permission> permissions = permissionService.findAll();
        //2.遍歷權限,拿到權限與資源
        for (Permission permission : permissions) {
            String url = permission.getUrl();//資源
            String sn = permission.getSn();//權限
            //把路徑與資源放到攔截中去
            maps.put(url,"wglPer["+sn+"]");
        }
        //設置所有攔截
        maps.put("/**", "authc");
        return maps;
    }
    

    }

    4.完成登錄功能

    登錄驗證
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    //1.拿到令牌
    UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
    //2.根據令牌獲到username -> 拿到密碼(沒有密碼返回null)
    String username = token.getUsername();
    Employee loginUser = iEmployeeService.findByUsername(username);
    if (loginUser == null) {
    return null;
    }
    String password1 = loginUser.getPassword();
    //設置鹽值
    ByteSource salt = ByteSource.Util.bytes(“wgl”);
    SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(loginUser, password1, salt, getName());
    return authenticationInfo;
    }
    完成登錄
    @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();
    }
    控制層
    @RequestMapping(value = “/login”, method = RequestMethod.GET)
    public String index() {
    return “login”;
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public JsonResult login(String username, String password) {
        //1.拿到subject(當前用戶)
        Subject subject = SecurityUtils.getSubject();
        //2.如果沒有登錄,放它登錄
        if (!subject.isAuthenticated()) {
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            try {
                subject.login(token);
            } catch (UnknownAccountException e) {
                e.printStackTrace();
                return  new JsonResult(false,"用戶名出錯");
            } catch (IncorrectCredentialsException e) {
                e.printStackTrace();
                return  new JsonResult(false,"用戶名或者密碼錯誤");
            } catch (AuthenticationException e) {
                System.out.println("未知錯誤");
                return  new JsonResult(false,"未知錯誤");
            }
        }
        UserContext.putUser();
        //成功到主頁面
        return new JsonResult();
    }
    
    @RequestMapping("logout")
    public String logout(){
        //獲取當前用戶
        Subject subject = SecurityUtils.getSubject();
        //退出登錄
        subject.logout();
        return "redirect:/login";
    }
    

    小功能

    1.回車登錄
    $(document.documentElement).on(“keyup”, function(event) {
    //console.debug(event.keyCode);
    var keyCode = event.keyCode;
    console.debug(keyCode);
    if (keyCode === 13) { // 捕獲回車
    submitForm(); // 提交表單
    }
    });
    .2.登錄過期問題
    // 檢查自己是否是頂級頁面
    if (top != window) {// 如果不是頂級
    //把子頁面的地址,賦值給頂級頁面顯示
    window.top.location.href = window.location.href;
    }

    5.權限

    關系
    用戶----多對多—角色–多對多—權限- 多種方案—資源
    權限和資源之間的關系分:一對一,多對一,多對多
    注意
    @JsonIgnore //生成json是忽略這個屬性(數據大多,全部拿到沒有意義,還有可能造成死循環)
    private Set roles = new HashSet<>();

    3.3.4.完善權限頁面

    名稱:
    資源路徑:
    權限:
    描述:

    4.角色管理(頁面功能)

    4.1.準備角色數據顯示
    4.1.1.role.jsp

    4.1.2.role.js
    function formatperms(val){
    var persStr = “” ;
    for(var i=0;i<val.length;i++){
    var permission = val[i];
    persStr += permission.name;
    if(i<val.length-1){
    persStr+=",";
    }
    }
    return persStr;
    }

    4.2.添加修改角色

    名稱: 編碼:
    名稱 對應的資源 對象的權限
    名稱 對應的資源 對象的權限

    role.js

    //用戶權限列表
    var userPermissionGrid =KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#?userPermissionG…("#allPermissionGrid");


    var itsource={

    … //添加數據(彈出添加的模態框)
    add:function () {
    //如果有data-save屬性,我們把它展示出來
    $("[data-save]").show();
    //啟動有data-save屬性的input元素的驗證功能
    $("
    [data-save] input").validatebox(“enableValidation”);
    roleForm.form(“clear”);//清除數據
    //彈出表單窗口
    roleDialog.dialog(“center”).dialog(‘open’);
    //當前用戶權限清空
    userPermissionGrid.datagrid(“loadData”,[]);
    },
    //修改數據(彈出修改的模態框)
    edit:function () {
    //選中了某一條數據才刪除
    var row = roleGrid.datagrid(“getSelected”);
    if(row){
    //隱藏有data-save屬性的元素
    $("[data-save]").hide();
    //禁用有data-save屬性的input元素的驗證功能
    $("
    [data-save] input").validatebox(“disableValidation”);

            roleForm.form("clear");//清除數據
            roleDialog.dialog("center").dialog('open');
            //為form加載數據
            roleForm.form("load",row);
    
            //單獨解決權限的回顯問題(注意,這里要準備一個新的權限,以免刪除時出問題)
            var permissions = [];
            $.extend(permissions,row.permissions);
            userPermissionGrid.datagrid("loadData",permissions);
    
        }else{
            $.messager.alert('提示信息','請選擇一行再進行修改!','info');
        }
    },
    

    //雙擊所有權限,把一個權限交給這個角色
    addPermission:function(rowIndex, rowData){
        //判斷是否有重復的行
        //1.拿到角色權限所有的行數據
        var rows = userPermissionGrid.datagrid("getRows");
        //2.遍歷rows拿到每一個員工數據
        for(var i=0;i<rows.length;i++){
            var row = rows[i];                //3.判斷如果出現相等數據的情況
    
            if(row.id == rowData.id){
                //不做任何操作(也可以給出提示)
                $.messager.show({
                    title:'提示',
                    msg:'該權限已經添加!',
                    timeout:2000,
                    showType:'slide'
                });
                return;
            }
        }
        //把數據加到相應角色權限Grid中
        userPermissionGrid.datagrid("appendRow",rowData);
    },
    //雙擊后移動相應的權限
    removePermission:function (rowIndex, rowData) {
        userPermissionGrid.datagrid("deleteRow",rowIndex);
    }
    

    }

    //我們在這里創建兩個Grid
    //1.創建當前角色的權限Grid
    userPermissionGrid.datagrid({
    fit:true,
    fixed:true,
    fitColumns:true,
    //雙擊后移除權限
    onDblClickRow:itsource.removePermission
    })

    //2.獲取所有權限的Grid
    allPermissionGrid.datagrid({
    fit:true,
    fixed:true,
    fitColumns:true,
    //toolbar:’#tb’,
    // singleSelect:true";
    url:"/permission/page",
    rownumbers:“true” ,
    pagination:“true”,
    //雙擊后添加權限
    onDblClickRow:itsource.addPermission
    })

    4.3.保存數據
    var itsource={
    //保存數據
    save:function () {
    var url = “/role/save”;
    var id = $("#roleId").val();
    if(id){
    url = “/role/update?cmd=update”;
    }
    roleForm.form(‘submit’, {
    url:url,
    //這里我們加上params,可以通過這個參數修改咱們的提交數據
    onSubmit: function(param){
    //得到所有明細
    var rows = userPermissionGrid.datagrid(“getRows”);
    //準備傳參數據(權限多條數據,是個數組)
    //param.permissions = [];
    for(var i=0;i<rows.length;i++){
    //設置相應的數據值
    param[“permissions[”+i+"].id"] =rows[i].id;
    }

                //做驗證
                return roleForm.form("validate");
            },
            success:function(data){
                var result = JSON.parse(data);//轉成相應的json數據
                if(result.success) {
                    roleGrid.datagrid('reload');
                    roleDialog.dialog('close');
                }else{
                    $.messager.alert('提示信息','操作失敗!,原因:'+result.msg,"error");
                }
            }
        })
    }
    

    }

    /**

    • 特性:在執行相應方法之前都會先執行這個方法
      */
      @ModelAttribute(“editRole”)
      public Role beforeEdit(Long id, String cmd){
      //有id的時候-> 修改功能
      if(id!=null && “update”.equals(cmd)) {
      Role role = roleService.findOne(id);
      //把這個要修改的關聯對象設置為null,可以解決n-to-n的問題
      role.getPermissions().clear();
      return role;
      }
      return null;
      }
      修改的時候只能添加不能減少
      @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;
      }
    版權聲明:本文為wgl04193410原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/wgl04193410/article/details/95962213

    智能推薦

    mysql高級【6】:mysql用戶、角色的管理(單用戶多角色等)

     講了這么多可以發現很多的操作都是基于root(最高權限的用戶)用戶的,但是有的用戶是新增的,不可能所有的人都有最高權限嘛,就好比一個公司,市場經理肯定沒有審批項目經理的請假的權限吧,項目經理也沒有刪除公司人員信息的權限吧,等等,其實除了最高權限的管理員,很多的用戶和角色都是只有操作使用到或者相關連的權限。這樣可以保證系統的安全性。mysql數據庫也是這樣的,有的用戶可能只有查看數據的權...

    laravel中角色與權限的管理

    1、頁面 代碼: 2、權限按鈕的控制器 3、權限頁面 代碼: 4、提交后的修改實現 5、模型中的實現...

    oracle內置角色connect與resource

    內置角色connect與resource 一般情況下,在新建數據庫用戶后,都會習慣性的給用戶授權CONNECT角色和RESOURCE角色,授權語句: 但是這兩個內置的角色具體包含那些權限,卻不甚清楚。我們可以通過查詢dba_sys_privs,來查看一下 CONNECT:僅有CREATE SESSION的權限 RESOURCE:僅具有CREATE CLUSTER,INDEXTYPE,OPERATO...

    MySQL8用戶與角色管理

    文章目錄 MySQL用戶管理 創建用戶 查看用戶權限 添加/刪除權限 查詢表權限 使用新創建的用戶登陸 修改密碼 刪除用戶 mysql用戶管理表 caching_sha2_password插件 validate_password組件的安裝和卸載 MySQL用戶角色 方法1:模擬權限【不建議】 方法2:角色賦權【推薦】 MYSQL用戶驗證步驟 MySQL用戶管理 創建用戶 查看用戶權限 USAGE表...

    角色管理與今日內容介紹

    需求分析  完成權限(菜單,按鈕(權限點),API接口)的基本操作 權限與菜單,菜單與按鈕,菜單與API接口都是一對一關系。為了方便操作,在SAAS-HRM系統的表設計中,采用基于共享主鍵的形式實現一對一關系維護,并且數據庫約束,一切的關系維護需要程序員在代碼中實現。   ...

    猜你喜歡

    納稅服務系統【角色與用戶】

    用戶與角色之間的關系 我們在做用戶模塊的時候,漏掉了最后一個功能。在新增功能中是可以選擇角色的。 用戶與角色之間的關系也是多對多 一個用戶對應多個角色 一個角色可以被多個用戶使用。 現在呢,我們的用戶表已經是寫的了。我們最好就不要修改原有的用戶表數據。那我們在不修改用戶表代碼的情況下,又怎么來實現多對多呢?? 跟角色與權限是一樣的。使用中間表來維護它們的關系就行了。 設計中間表 主鍵表 映射文件 ...

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...

    FlycoTabLayout 的使用

    FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...

    爬蟲項目實戰八:爬取天氣情況

    爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...

    關于web項目的目錄問題

    先給段代碼: 上面這個代碼一直出錯,我不知道原因,后面不停的查找資料發現了問題:我的web項目輸出目錄有問題,因為我也是第一次用idea寫web項目,發現很多bug 其實都沒有太大問題,我們需要注意的是你必須在out這個輸出文件夾中擁有這個文件,out輸出文件夾會默認過濾這些文件...

    精品国产乱码久久久久久蜜桃不卡