退出
- (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(“权限名称”)