1. 程式人生 > >Java——SSM+Shiro實現JSP頁面授權功能(面向小白)

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!!!