shiro,


最近の古いプロジェクトの統合、時間を割いて研究して、Apache Shiro.
まずApache Shiroはspringプロジェクトで基本的に構成されています.
1、spring-config-*.xmlでの構成
<!--         -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
 <!--                -->  
<property name="loginUrl" value="/index.jsp" />  
<property name="successUrl" value="/loginSuccess.jsp" />  
<property name="unauthorizedUrl" value="" />  
<property name="filterChainDefinitions">
    <value>  
        /logout.do = logout  
        /user/** = authc  
        /admin/** = authc,roles[admin]  
    </value>  
</property>
</bean>
<!--   Shiro       -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="systemAuthorizingRealm" />
<property name="sessionManager" ref="sessionManager" />
<property name="cacheManager" ref="shiroCacheManager" />
</bean>

2、web.xmlでの構成
<!-- Apache Shiro -->
	<filter>
		<filter-name>shiroFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>shiroFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

**filter-nameとbeanidは同じである必要があります.DelegatingFilterProxyはこのfilter-nameでbeanidを検索します.
プロジェクトの開始時:
まず、
DelegtingFilterProxyクラスで初期化し、Filter delegateの変数をbeanId=に初期化します.
shiroFilterのセキュリティ認証
SpringShiroFilter 
.
また詳しく見てください
org.apache.shiro.spring.web.ShiroFilterFactoryBeanはどのように実現されていますか.
urlを実行すると、次の順序になります.
org.springframework.web.filter.DelegatingFilterProxy.doFilter --->(
SpringShiroFilter
 
)
delegate.doFilter----->
doFilterInternal
shiroマルチログイン構成
複数のログインページからの構成を実装するには、次の手順に従います.
実装方法は、filterchainをカスタマイズすることです.
具体的な方法は以下の通りです.
<!--         -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
 <!--                -->  
<property name="loginUrl" value="/index.jsp" />  
<property name="successUrl" value="/loginSuccess.jsp" />  
<property name="unauthorizedUrl" value="" />  
<property name="filterChainDefinitions">
    <value>  
        /logout.do = logout  
        /user/** = authc  
        /admin/** = authc,roles[admin]
        /index/** = shopauthc
    </value>  
</property>
<!--     -->
	<bean id="shopformauthenticationfilter" class="org.mia.ontelshop.modules.sys.security.ShopFormAuthenticationFilter">
		<property name="loginUrl" value="index/login" />
		<property name="successUrl" value="index?login" />
	</bean>
原理:
スプリングがshiroFilterを初期化すると、次のようになります.
private void applyLoginUrlIfNecessary(Filter filter) {
        String loginUrl = getLoginUrl();
        if (StringUtils.hasText(loginUrl) && (filter instanceof AccessControlFilter)) {
            AccessControlFilter acFilter = (AccessControlFilter) filter;
            //only apply the login url if they haven't explicitly configured one already:
            String existingLoginUrl = acFilter.getLoginUrl();
            if (AccessControlFilter.DEFAULT_LOGIN_URL.equals(existingLoginUrl)) {
                acFilter.setLoginUrl(loginUrl);
            }
        }
    }
    private void applySuccessUrlIfNecessary(Filter filter) {
        String successUrl = getSuccessUrl();
        if (StringUtils.hasText(successUrl) && (filter instanceof AuthenticationFilter)) {
            AuthenticationFilter authcFilter = (AuthenticationFilter) filter;
            //only apply the successUrl if they haven't explicitly configured one already:
            String existingSuccessUrl = authcFilter.getSuccessUrl();
            if (AuthenticationFilter.DEFAULT_SUCCESS_URL.equals(existingSuccessUrl)) {
                authcFilter.setSuccessUrl(successUrl);
            }
        }
    }

にある
ShiroFilterFactoryBean
このクラスは注入されたfilter属性loginUrl,successUrlを初期化し,どのように元のデフォルト値の化が,新しい値に初期化されるか,そうでなければ変更しない.