0
点赞
收藏
分享

微信扫一扫

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)如果没有权限则出现报错
  • Day41项目saas-export项目-授权功能***_java


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

第二种访问代码

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"/>​
  • Day41项目saas-export项目-授权功能***_企业管理_03


第三种访问代码

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>

小结

Day41项目saas-export项目-授权功能***_用户管理_04

小结

shiro流程总结

  • (1)认证: subject.login(token);
  • Day41项目saas-export项目-授权功能***_企业管理_05

  • (2)授权: subject.checkPermission(“权限名称”)
  • Day41项目saas-export项目-授权功能***_web应用_06


举报

相关推荐

0 条评论