Java——SSM+Shiro實現JSP頁面授權功能(面向小白)

在之前的博客中已經實現了Shiro的登陸認證功能——《SSM+Shiro實現登陸認證》

今天利用Shiro實現一個頁面細粒化權限的控制功能。

爲什麼說是細粒化呢?因爲它可以精準到頁面上的每一個按鈕,把控每一個按鈕的訪問權限,可以說是非常強大了,而且簡單~

想實現頁面的授權功能首先要在頁面導入一個shiro的標籤:

<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>

然後用以下標籤包裹

<shiro:hasPermission name=""></shiro:hasPermission>

實現權限的控制!

我現在要對後臺的一個菜單中的 “發佈商品” 進行權限控制

在頁面的代碼中加上Shiro的標籤(這兩個標籤對應着頁面上的雲市場與發佈商品)

                <li class="layui-nav-item"><a href="">雲市場</a></li>


                <shiro:hasPermission name="push">
                <li class="layui-nav-item"><a href="">發佈商品</a></li>
                </shiro:hasPermission>

在發佈商品的標籤上包裹了一層shiro的標籤,那麼登陸的用戶必須要有shiro標籤中 “name” 對應的權限!

可以看到,加上這個標籤以後再次訪問頁面,“發佈商品” 菜單不見了

那麼這個時候如果我們想看到它,就只需要在realm的授權方法中給他對應的權限即可!

/**
     * 授權的時候回調
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addStringPermission("push");//這裏添加進去的“push” 對應着前端頁面的name值  
         //"*"代表所有權限
        return info;
    }

這樣以後頁面的 發佈商品 又回來了!

其實Shiro權限控制原理大致就是如此,當然啦,這裏只是一個簡單的小例子,如果要做到根據角色分配權限,只是在數據庫裏多建幾張表關聯起來而已,根據對應的角色查詢它所擁有的權限,然後循環遍歷add到info裏即可!

這裏舉個簡單例子,實現通過遍歷數據庫來獲得權限(這裏只是簡單的例子,就不用中間表啦)

爲了更好的演示,在前端頁面給 “雲市場” 也加上Shiro的標籤,name設置爲"shop"

                <shiro:hasPermission name="shop">
                <li class="layui-nav-item"><a href="">雲市場</a></li>
                </shiro:hasPermission>
                <shiro:hasPermission name="push">
                <li class="layui-nav-item"><a href="">發佈商品</a></li>
                </shiro:hasPermission>

 

首先是用戶表

權限表:

pid:權限對應的一個編號,在用戶表上給對應的用戶添加pid來獲得對應的權限~

這裏給用戶“萌”的pid(權限編碼)爲2,2在權限表對應的是push與shop權限,也就是說用戶 “萌”有訪問“雲市場”與“發佈商品” 的權限!!!

 

授權的回調方法如下:

    /**
     * 授權的時候回調
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        User user = (User) principalCollection.getPrimaryPrincipal();//獲取到登陸的對象
        if(user.getPid()==1){//如果權限編碼爲1就是超級管理員
            info.addStringPermission("*");//賦予管理員所有權限
        }else {
            List<Permission> list = loginService.QueryAllPermission(user.getPid());//如果是普通用戶就根據權限編號pid去數據庫查詢
                for (Permission permission:
                    list) {
                    info.addStringPermission(permission.getPermission());//遍歷添加權限
                }
        }
        return info;
    }

然後用用戶“萌” 的賬號密碼登陸~

可以看到她已經擁有了訪問這兩個菜單的權限~

 

The end!!!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章