1. 程式人生 > >### shiro自定義filter【解決某個請求 需要同時擁有多種許可權】

### shiro自定義filter【解決某個請求 需要同時擁有多種許可權】

1. shiro的filter介紹

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/login" />
        <property name="successUrl" value="/home" />
        <property name="unauthorizedUrl" value="/unauthorized" />
        <!-- filters一般不需要定義,除非自定義filter覆蓋原來的時候,需要定義 -->
        <!-- <property name="filters">
            <map>
                <entry key="authc">
                    <bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" />
                </entry>
            </map>
        </property> -->
        <property name="filterChainDefinitions">
            <value>
                /admin = authc,roles[admin]
                /edit = authc,perms[admin:edit]
                /home = user
                /** = anon
            </value>
        </property>
    </bean>
loginUrl: 當用戶沒有登入的時候,會重發一個login請求,引導使用者去登入

successUrl:是當用戶登入成功,轉發home請求
unauthorizedUrl指如果請求失敗,重發/unauthorized請求,引導使用者到認證異常錯誤頁面
 <property name="filters">
            <map>
                <entry key="authc">
                    <bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" />

                </entry>
            </map>
        </property>
把PassThruAuthenticationFilter新增別名為authc,這時/admin請求會交給PassThruAuthenticationFilter處理,替換了原來由FormAuthenticationFilter來處理。
由此一來,如果有些特殊的請求需要特殊處理,就可以自己寫一個filter,新增一個別名,如:
<property name="filters">
            <map>

                <entry key="new">
                    <bean class="com.text.newFilter" />
                </entry>
            </map>
        </property>

2. shiro自定義filter

使用shiro的時候,比較常用的filter有anon,authc,roles和perms。當我們想定義某個連結是擁有某些許可權的使用者才可以訪問的時候,我們可以這樣定義。/xx = roles[A,B]。在shiro中,表示當前使用者同時擁有A,B兩種角色才可以訪問/xx這個連結,是一種&&(與)的關係

RolesAuthorizationFilter這樣一個類,這個類就是定義roles的filter。

01 public class RolesAuthorizationFilter extends AuthorizationFilter {
02
03 //TODO - complete JavaDoc
04
05 @SuppressWarnings({"unchecked"})
06 public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
07
08 Subject subject = getSubject(request, response);
09 String[] rolesArray = (String[]) mappedValue;
10