复习步骤9-获取权限数据CustomRealm提供subject桥梁,集成spring -shiro XML配置文件权限--自定义和非自定义授权过滤器
项目目录结构
非自定义授权过滤器
spring.xml 中 加
/testrole1=roles["admin"] <!-- 要有admin 角色才可以访问 /testrole url-->
/testrole2=roles["admin","sjr"] <!-- 要有admin和 sjr 角色才可以访问 /testrole2 url 未测-->
/testPerms1=perms["user:select"] <!-- 要有user:select 权限 才可以访问 /testPerms1 url-->
/testPerms2=perms["user:select","user:update","user:add"] <!-- 要同时有user:select,user:update,user:add 权限 才可以访问 /testPerms2 url-->
UserController.java中加
//produces = "application/json; charset=utf-8" 解决@ResponseBody 返回中文乱码
/*配置文件方式 配置授权--非自定义授权过滤器 测试账号,一般为 刘少峰 123456 登录(数据存的密码事 123456 和 yan 加密的) */
// 配置文件方式 配置授权--非自定义授权过滤器 在 spring.xml shiro中 /testrole1=roles["admin"] --要有admin 角色才可以访问 /testrole1 url,登录之后有admin角色 请求 /testrole1 就可以进来了
@RequestMapping(value="/testrole1",method=RequestMethod.GET,
produces = "application/json; charset=utf-8")
@ResponseBody
public String testrole1(){
return "有admin角色,登录成功";
}
// 配置文件方式 配置授权--非自定义授权过滤器 在 spring.xml shiro中 /testPerms1=perms["user:select"] --要有user:select 权限 才可以访问 /testPerms1 url,登录之后有user:select角色 请求 /testrole1 就可以进来了
@RequestMapping(value="/testPerms1",method=RequestMethod.GET,
produces = "application/json; charset=utf-8")
@ResponseBody
public String testPerms1(){
return "有user:select 权限,登录成功";
}
// 配置文件方式 配置授权--非自定义授权过滤器 在 spring.xml shiro中 /testPerms2=perms["user:select","user:update","user:add"] --要同时具有user:select,user:update,user:add 权限 才可以访问 /testPerms2 url,登录之后 请求 /testrole2 就可以进来了
@RequestMapping(value="/testPerms2",method=RequestMethod.GET,
produces = "application/json; charset=utf-8")
@ResponseBody
public String testPerms2(){
return "有user:select,user:update,user:add 权限,登录成功";
}
先用 刘少峰 123456 登录
然后再 /testPerms1 ,/testPerms2,/testrole1 测试
//自 定义角色权限 过滤器
自定义角色权限过滤器类
RolesOrFilter.java
package com.xiangshuai.filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
/**
* maven 项目- 文件位置:E:\学习文档子目录压缩\框架\shiro\shiro安全框架入门\复习步骤9-获取权限数据CustomRealm提供subject桥梁,集成spring -shiro XML配置文件权限--自定义和非自定义授权过滤器
* 我的网盘/我的笔记/学习文档子目录压缩\框架\shiro\shiro安全框架入门\复习步骤9-获取权限数据CustomRealm提供subject桥梁,集成spring -shiro XML配置文件权限--自定义和非自定义授权过滤器
* 自定义filter做权限检查 rolesOR 拦截,只要 含有其中任意一个roles角色,就可以访问
* @author lqx
*AuthorizationFilter这个抽象类也是继承自AccessControlFilter,(其他过滤器百度),他是用于处理登陆后的权限检查
*/
public class RolesOrFilter extends AuthorizationFilter{
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
throws Exception {
Subject subject = getSubject(request, response);//filter的父类 提供了用getSubject获得主体的方法
String[] roles=(String[]) mappedValue;//这个参数就是由 拦截器定义的 比如浏览器请求 testRoleOr1 时在 shiro,spring.xml中定义的rolesOR["sjr","admin"] ,那么这个mappedValue 就是["sjr","admin"]
if(roles==null || roles.length==0){//不需要权限
return true;
}
for (String role : roles) {
if(subject.hasRole(role)){//如果subject 含有访问目标资源的权限,那么chain拦截器链就放行
return true;
}
}
return false;
}
}
spring.xml 中 加
<!-- 定义RolesOrFilter,让spring IOC -->
<bean class="com.xiangshuai.filter.RolesOrFilter" id="rolesOrFilter"/>
UserController.java中加
// 配置文件方式 配置授权--自定义授权过滤器 自定义 rolesOR 拦截,用户登录之后 只要 含有其中任意一个roles角色,就可以访问 在 spring.xml shiro中 /testRoleOr1=rolesOR["sjr","admin"] /testRoleOr2=rolesOR["hehehe","test1"]-
@RequestMapping(value="/testRoleOr1",method=RequestMethod.GET,
produces = "application/json; charset=utf-8")
@ResponseBody
public String testRoleOr1(){//刘少峰 123456 含有 admin权限,所以可以访问此资源--/testRoleOr1=rolesOR["sjr","admin"]
return "没有sjy有权限,但有admin权限,登录成功";
}
@RequestMapping(value="/testRoleOr2",method=RequestMethod.GET,
produces = "application/json; charset=utf-8")
@ResponseBody
public String testRoleOr2(){//刘少峰 123456 不含有 hehehe权限,也不含有test1,所以不可以访问此资源-/testRoleOr2=rolesOR["hehehe","test1"]
return "既没有heheh 权限,也没有哦test1权限,";
}
页面请求