1. 程式人生 > >Apache Shiro動態設定許可權可對應訪問路徑

Apache Shiro動態設定許可權可對應訪問路徑

使用過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中