1

Apache Shiroを使用してSpring対応のWebアプリのセキュリティを強化しようとしているため、フィルターチェーン定義をSpring構成のファイルに構成しています。同等の機能を実現するにはどうすればよいですか

@Controller
@RequestMapping("/mywebapp")
// @RequiresAuthentication (is this possible ? wish i could do this !)
public class MyWebAppController  {

@RequiresRoles(value={"Role1","Role2","Role3"},logical=Logical.OR)
@RequestMapping(value="/home", method = RequestMethod.GET)
public String home() { return .. }

そして私のspring-configファイルにはこれが含まれています:私のdispatcherservletが/ rest/*にマップされていると仮定します

  <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <property name="loginUrl" value="/rest/secure/windowslogin"/>
    <property name="successUrl" value="/mywebapp/rest/menu"/>
    <property name="unauthorizedUrl" value="/mywebapp/rest/unauthorized"/>
    <property name="filters">
        <util:map>
            <entry key="anon">
                <bean class="org.apache.shiro.web.filter.authc.AnonymousFilter"/>
            </entry>
            <entry key="authc">
       <!-- why is this not invoked ? -->
                <bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter">
                </bean>
            </entry>
            <entry key="roles">
                <bean class="org.apache.shiro.web.filter.authz.RolesAuthorizationFilter"/>
            </entry>
        </util:map>
    </property>
    <property name="filterChainDefinitions">
        <value>
            /rest/secure/** = anon
            /rest/mywebapp/** = authc, roles[Role1,Role2,Role3]
        </value>
    </property>
</bean>

/rest/mywebapp/**上記のコードでは、前述のロールを使用するための論理的または一種のマッピングが必要です。これはshiroアノテーションを介して可能であり、機能しますが、すべてのメソッドで指定するのではなく、ここで処理したいと思います(shiroがクラスレベルのアノテーションをまだサポートしているとは思わないので?)。これは可能ですか?

また、補足として、authcフィルターが呼び出されないのはなぜですか?(今のところ、Windowsログインは認証として機能し、認証にのみshiroを使用できると想定しています)

home page = meta refresh to /rest/secure/windowslogin/
             if within intranet -> login ...
             else /rest/secure/login ... login page.

loginurlが違うからですか?これを回避するにはどうすればよいですか?構成ファイルで指定されたroles[..]部分を使用して、レルムのgetAuthorizationInfoが呼び出されることに注意してください。ただし、要求が「authc」であるかどうかを確認するためのチェックが必要であると想定していました。(これはおそらく、フィルターが呼び出され、SubjectUtils.getSubject()が認証のためにチェックされることを意味します)。フローまたは構成に何かが欠けていますか?

4

1 に答える 1

1

shiro-security.xml は次のようになります。

<bean id="customFilter1" class="com.pkg.RolesAuthorizationFilter">
        <property name="roles" value="ROLE1,ROLE3,ROLE5"></property>
</bean>
<bean id="customFilter2" class="com.pkg.RolesAuthorizationFilter">
        <property name="roles" value="ROLE1,ROLE2,ROLE5,ROLE6"></property>
</bean>

<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" />    
     <property name="filters">
        <util:map>
            <entry key="authc">
                <bean   class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" />
            </entry>
        </util:map>
    </property>

<property name="filterChainDefinitions">
            <value>
             /resources/** = anon
                /login = anon
                /logout = authc             
                /unauthorized = authc
                /someurl/** = customFilter2
                /** = customFilter1
            </value>
        </property>
</bean>

そして、これは RolesAuthorizationFilter クラスです

package com.pkg;

import java.util.Arrays;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.log4j.Logger;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

public class RolesAuthorizationFilter extends AuthorizationFilter {
    protected Logger logger = Logger.getLogger(this.getClass()
            .getCanonicalName());

    private String[] roles;

    @Override
    protected boolean isAccessAllowed(ServletRequest request,
            ServletResponse response, Object mappedValue) throws Exception {

        logger.info("= Roles = " + Arrays.toString(roles));

        Subject subject = getSubject(request, response);
        boolean allowAccess = false;

        for (String role : roles) {
            if (subject.hasRole(role)) {

                logger.info("Authenticated role " + role);

                allowAccess = true;
                break;
            }
        }

        return allowAccess;
    }

    public void setRoles(String[] roles) {
        this.roles = roles;
    }   
}
于 2012-08-23T10:11:43.663 に答える