Java——SSM+Shiro实现JSP页面授权功能(面向小白)

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/MaNongXf/article/details/83826194

在之前的博客中已经实现了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!!!

猜你喜欢

转载自blog.csdn.net/MaNongXf/article/details/83826194
今日推荐