Day41项目saas-export项目-授权功能***

退出

  • (1)之前我们再退出时候,已经实现了退出后销毁session。
    //删除Shiro的session(底层:删除session数据)
    Subject subject = SecurityUtils.getSubject();
    subject.logout();
    @RequestMapping(path = "/loginOut-shiro", method = {RequestMethod.GET, RequestMethod.POST})
    public String loginOutShiro(){
        //删除session中的用户信息
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "redirect:/login-shiro.jsp";
    }

修改连接

<a href="${path}/system/user/loginOut-shiro.do" class="btn btn-default btn-flat">注销</a>

shiro授权 介绍

  • (1)什么是授权?
    授权,也叫做授权访问校验
    登陆认证后,系统校验用户是否有权限访问资源,就叫授权
  • (2)如何实现授权?分为以下两个步骤
    》1 登陆认证成功后,获取用户的权限 (获取权限)
    》2 访问资源时候,进行授权校验:用访问资源需要的权限去用户权限列表查找,如果存在,则有权限访问资源。(权限拦截)
  • (3)授权校验有几种方式
    1) 硬编码方式(拦截方法)(非Web应用,Web应用)
    2) 过滤器配置方式(拦截url)(Web应用)
    3) 注解方式(拦截方法)(Web应用)
    4) shiro提供的标签((拦截页面元素:按钮,表格等))(Web应用)

查询权限sql(了解)

# lw@export.com 查询拥有的权限的名字

select distinct m.name from pe_user u 
inner join pe_role_user ru on ru.user_id = u.user_id
inner join pe_role_module rm on ru.role_id = rm.role_id
inner join ss_module m on m.module_id = rm.module_id
where u.email = 'lw@export.com'

# hello@xx.com 查询拥有的权限的名字

select distinct m.name from pe_user u 
inner join pe_role_user ru on ru.user_id = u.user_id
inner join pe_role_module rm on ru.role_id = rm.role_id
inner join ss_module m on m.module_id = rm.module_id
where u.email = 'hello@xx.com'

编写 查询权限的逻辑

   //授权(查有什么权限)
    @Autowired
    IModuleService iModuleService;
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        l.info("AuthRealm doGetAuthorizationInfo 函数执行了");
        //获取用户信息
        Subject subject = SecurityUtils.getSubject();
        User user = (User) subject.getPrincipal();//session
        l.info("doGetAuthorizationInfo user "+user);//当前用户是谁
        if(user != null){
            //要求查询当前账号email包含哪些权限(中文表示)
            List<Module> list = iModuleService.findModulesByUser(user);
            SimpleAuthorizationInfo info =new SimpleAuthorizationInfo();
            //循环
            for(Module m:list){
                l.info("doGetAuthorizationInfo m "+m.getName());
                //将字符串表示的权限名称添加到shiro
                info.addStringPermission( m.getName());
            }//end for
            return info;
        }//end if
        return null;
    }

第一种访问代码(不推荐) 硬编码

  • (1)虽然看不到用户管理,但直接输入地址,也可以访问
    因此,需要给用户管理添加权限
  • (2)判断权限方法调用
    Subject subject = SecurityUtils.getSubject();
    subject.checkPermission("用户管理");
    会调用:com.wzx.web.shiro.AuthRealm#doGetAuthorizationInfo
  • (3)如果没有权限则出现报错
    在这里插入图片描述
    在这里插入图片描述

第二种访问代码

XML配置方式实现权限管理(推荐)

  • (1)通过XML配饰方式实现需求: 有用户管理的权限,才可以访问; 否则拒绝访问。
  • (2)原理:shiro过滤器
    拦截请求时,获取授权
  • (3)在applicationContext-shiro.xml
    <!-- 给url配置权限--> /company/toList.do=perms["企业管理"] /system/user/toList.do=perms["用户管理"]
  • (4)可以指定无权限页面提示
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
    在这里插入图片描述

第三种访问代码

shiro授权 注解方式实现

  • (1)通过注解配置方式实现需求: 有用户管理的权限,才可以访问; 否则拒绝访问。(先注释掉xml配置部分)
  • (2)实现步骤
    》1 在applicationContext-shiro.xml中开启shiro注解支持
    <!-- @RequiredPermission-->
    <bean id="lifecycleBeanPostProcessor"
          class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
          depends-on="lifecycleBeanPostProcessor"/>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>

》2 开启Aop自动代理(已经完成)
springmvc.xml
<aop:aspectj-autoproxy/>
》3 在controller中使用
@RequiresPermissions(“”)注解
@RequiresPermissions("企业管理")

第四种访问方式

shiro授权 Shiro标签实现权限管理

  • (1)新建测试页面
    shiro-test.jsp
    不同账号进行访问
    》1 在页面引入shiro标签 ,类似c标签
    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
    》2 使用shiro标签 给name赋值,赋上什么值就表示需要什么权限
<%--        标签会查询权限,如果没有权限不报错,将页面内容进行隐藏,反之显示页面内容--%>

        <shiro:hasPermission name="企业管理">
            <a href="">企业管理</a>
        </shiro:hasPermission>

        <shiro:hasPermission name="用户管理">
            <a href="">用户管理</a>
        </shiro:hasPermission>

        <shiro:hasPermission name="日志管理">
            <a href="">日志管理</a>
        </shiro:hasPermission>

小结在这里插入图片描述

小结

shiro流程总结

  • (1)认证: subject.login(token);
    在这里插入图片描述

  • (2)授权: subject.checkPermission(“权限名称”)
    在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翁老师的教学团队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值