Apache Shiro動態設定許可權可對應訪問路徑
阿新 • • 發佈:2019-01-10
使用過Apache Shiro搭配spring MVC的都知道一般都是用方法上加註解方式控制URL訪問許可權,如下:
@RequestMapping(value = "create")
@RequiresPermissions(value = "user.create")
public String create(Model model) {
return "user/create";
}
下面說下個人在專案開發中使用的動態注入許可權對應路徑的方式,支援萬用字元*,無需在方法上面加註解。
1、實現FactoryBean
/**
*
* 功能說明: 授權元資料根據兩部分構成:
* 1、資料庫中動態生成,許可權表獲取
* 2、使用spring的注入filterChainDefinitions,在配置檔案中定義預設的安全定義,如登入頁面,首頁等
* @author hxt
* @date:2016-02-01
* @version: v1.0
*/
public class ShiroDefinitionSectionMetaSource implements FactoryBean<Ini.Section> {
@Autowired
private PermissionService permissionService;
//注入預設的授權定義
private String filterChainDefinitions;
//格式化資料,符合shiro的格式,如:perms["admin"]
public static final String PREMISSION_FORMAT = "perms[\"{0}\"]" ;
@Override
public Section getObject() throws Exception {
Ini ini = new Ini();
ini.load(filterChainDefinitions);
Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
//由注入的資源管理物件獲取所有資源資料,並且資源的authorities的屬性是EAGER的fetch型別
for(Permission permission : permissionService.getPermissions()) {
if (StringUtils.isBlank(permission.getPath())) {
continue;
}
//如果資源路徑的值為逗號分隔,則迴圈構造元資料。
if(permission.getPath().indexOf(",") != -1) {
String[] peths = permission.getPath().split(",");
for(String path : peths) {
putDefinitionSection(section, path, permission.getCode());
}
} else {
putDefinitionSection(section, permission.getPath(), permission.getCode());
}
}
return section;
}
private void putDefinitionSection(Section section, String key, String value) {
System.out.println("載入資料庫許可權:【key=" + key + "\tvalue=" + value + "】");
section.put(key, MessageFormat.format(PREMISSION_FORMAT, value));
}
public void setFilterChainDefinitions(String filterChainDefinitions) {
this.filterChainDefinitions = filterChainDefinitions;
}
@Override
public Class<?> getObjectType() {
return this.getClass();
}
@Override
public boolean isSingleton() {
return false;
}
}
許可權物件部分屬性示例:
/**
* 許可權名稱
*/
private String name;
/**
* 許可權編碼
*/
private String code;
/**
* 許可權路徑控制路徑(支援萬用字元(*),多路徑可以都好分割,如/user/info/**,/user/update)
*/
private String path;
/**
* 許可權說明
*/
private String describes;
/**
* 模組
*/
@XmlTransient
private Module module;
2、在applicationContext-shiro.xml中注入ShiroDefinitionSectionMetaSource
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login" />
<property name="successUrl" value="/main" />
<property name="unauthorizedUrl" value="/error?id=403" />
<property name="filters">
<map>
<entry key="authc" value-ref="myCaptchaFilter"/>
</map>
</property>
<property name="filterChainDefinitionMap" ref="filterMap"/>
</bean>
<bean id="filterMap" class="com.xxx.frame.base.security.ShiroDefinitionSectionMetaSource">
<property name="filterChainDefinitions">
<value>
/logout = logout
/static/** = anon
/images/** = anon
/** = authc
</value>
</property>
</bean>
這樣配置好後,就可以讀取資料庫中動態的許可權路徑資訊注入到shiroFilter中