## 重寫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標簽