## 重写MyRealm中的doGetAuthorizationInfo方法
```
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
User user = (User) SecurityUtils.getSubject().getPrincipal();
if(user!=null){
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
//获取当前用户角色
String role = user.getUserRole().getName();
authorizationInfo.addRole(role);
//获取当前用户的资源ID
String [] perms = user.getUserRole().getJurisdiction().getSaid().split(",");
for(String prem :perms){
authorizationInfo.addStringPermission(prem);
}
return authorizationInfo;
}
return null;
}
```
## 动态配置过滤规则
在resources文件下创建shiro.ini,添加默认的权限配置
格式如下:
```
[urls]
#用于 web,提供了对 web url 拦截相关的配置,url=拦截器[参数],拦截器
/index.html = anon
/admin/** = authc, roles[admin]
```
创建MyChainDefinitions动态加载权限配置
```
import org.apache.shiro.config.Ini;
import org.apache.shiro.web.config.IniFilterChainResolverFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Map;
public class MyChainDefinitions implements FactoryBean<Ini.Section> {
public static final String PREMISSION_STRING = "perms[{0}]";
private InputStream filterChainDefinitions;
public void setFilterChainDefinitions(InputStream filterChainDefinitions) {
this.filterChainDefinitions = filterChainDefinitions;
}
@Autowired
private JurisdictionService jurisdictionService;
@Override
public Ini.Section getObject() {
/** 查询数据库中所有的资源格式为:
* url role
* 资源路径,角色,角色1,角色2...
*/
Map<String,String> urls =JurisdictionService.findByCondition();
//加载配置默认的过滤链
Ini ini = new Ini();
ini.load(filterChainDefinitions);
Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);
if (CollectionUtils.isEmpty(section)) {
section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
}
for (String url : urls.keySet()) {
String[] perms = urls.get(url).split(",");
StringBuilder permFilters = new StringBuilder();
for (int i = 0; i < perms.length; i++) {
permFilters.append(perms[i]).append(",");
}
//去掉末尾的逗号
String str = permFilters.substring(0, permFilters.length() - 1);
//生成结果如:/dotest1.html = authc, perms[admin]
section.put(url, MessageFormat.format(PREMISSION_STRING, str));
}
return section;
}
@Override
public Class<?> getObjectType() {
return this.getClass();
}
@Override
public boolean isSingleton() {
return false;
}
}
```
## 修改ShiroConfiguration
```
1,增加myChainDefinitions方法
private MyChainDefinitions myChainDefinitions(){
MyChainDefinitions myChainDefinitions = new MyChainDefinitions();
ClassPathResource classPathResource = new ClassPathResource("shiro.ini");
try {
InputStream inputStream = classPathResource.getInputStream();
myChainDefinitions.setFilterChainDefinitions(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
return myChainDefinitions;
},2,修改shiroFilterFactoryBean方法
删除配置URL的filterChainDefinitionMap
将shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap)
替换为
shiroFilterFactoryBean.setFilterChainDefinitionMap(myChainDefinitions().getObject());
```
## 将权限改为|| 之前默认是&&
```
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AnyPermissionsAuthorizationFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object mappedValue) throws Exception {
Subject subject = getSubject(servletRequest, servletResponse);
String[] perms = (String[]) mappedValue;
for (String perm : perms) {
if (subject.isPermitted(perm)) {
return true;
}
}
return false;
}
}
```
- JDK常用知识库
- JDK各个版本安装
- Java8流
- 算法
- 十大排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 归并排序
- 快速排序
- 堆排序
- 希尔排序
- 计数排序
- 桶排序
- 基数排序
- 总结
- 常用工具类
- 浮点型计算
- 时间格式处理
- 常用功能点思路整理
- 登录
- 高并发
- 线程安全的单例模式
- Tomcat优化
- Tomcat之APR模式
- Tomcat启动过慢问题
- 常用的数据库连接池
- Druid连接池
- 缓存
- Redis
- SpringBoot整合Redis
- 依赖和配置
- RedisTemplate工具类
- 工具类使用方法
- Redis知识库
- Redis安装
- Redis配置参数
- Redis常用Lua脚本
- MongoDB
- SpringBoot操作MongoDB
- 依赖和配置
- MongoDB工具类
- 工具类使用方法
- 消息中间件
- ActiveMq
- SpringBoot整合ActiveMq
- 框架
- SpringBoot
- 定时任务
- 启动加载
- 事务
- JSP
- 静态类注入
- SpringSecurity
- Shiro
- 配置及整合
- 登陆验证
- 权限验证
- 分布式应用
- SpringMVC
- ORM框架
- Mybatis
- 增
- 删
- 改
- 查
- 程序员小笑话
- 我给你讲一个TCP的笑话吧
- 二进制笑话
- JavaScript的那点东西
- JavaScript内置对象及常见API详细介绍
- JavaScript实现Ajax 资源请求
- JavaScript干货
- 架构师成长之路
- JDK源码解析
- ArrayList源码解读
- 设计模式
- 微服务架构设计模式
- 逃离单体炼狱
- 服务的拆分策略
- 全面解析SpringMvc框架
- 架构设计的六大原则
- 并发集合
- JUC并发编程
- 搜索引擎
- Solr
- Solr的安装
- 分布式服务框架
- Dubbo
- 从零开始学HTMl
- 第一章-初识HTML
- 第二章-认识HTML标签