2016-04-08 14 views
0

すべてのエンドポイントに@RestController注釈を使用するSpring 4 MVCアプリケーションがあります。アプリケーションはweb.xmlapplicationContext.xmlも使用しません。すべてが完璧に動作し、今はApache Shiroが他のすべてと協力して作業しようとしています。Spring 4 MVC + Apache Shiro

のようにには、私が構築したRESTサービスのいずれかにアクセスするauthc/authzの問題があるときにShiroに例外がスローされます。

これまでのところ、私は史郎を初期化するための設定の基本的なクラスに設定することができました:私は@RequiresUserで、このようなエンドポイントを構築し、初期化子でAuthorizingRealmにブレークポイントを設定すると、何もいないようにみえ

@Configuration 
public class ShiroInitializer { 

    @Bean(name = "realmLocal") 
    @DependsOn ("lifecycleBeanPostProcessor") 
    public Realm realmLocal() { 
    return new AuthorizingRealm() { 
     @Override 
     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { 
     return null; 
     } 

     @Override 
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { 
     return null; 
     } 
    }; 
    } 

    @Bean (name = "lifecycleBeanPostProcessor") 
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { 
    return new LifecycleBeanPostProcessor(); 
    } 

    @Bean 
    public org.apache.shiro.mgt.SecurityManager getSecurityManager() { 
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); 
    securityManager.setRealm(realmLocal()); 
    return securityManager; 
    } 

    @DependsOn("lifecycleBeanPostProcessor") 
    @Bean 
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { 
    DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator(); 
    proxyCreator.setProxyTargetClass(true); 
    return proxyCreator; 
    } 

    // enable shiro annotations 
    @Bean 
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { 
    AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); 
    advisor.setSecurityManager(getSecurityManager()); 
    return advisor; 
    } 

    @Bean (name = "shiroFilter") 
    public ShiroFilterFactoryBean getShiroFilter() { 
    ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); 
    shiroFilter.setSecurityManager(getSecurityManager()); 

    Map<String, String> filters = new ConcurrentHashMap<>(); 
    filters.put("/**", "authcBasic"); 
    shiroFilter.setFilterChainDefinitionMap(filters); 

    return shiroFilter; 
    } 
} 

をピックアップしたメッセージは、任意のauthcは/のauthz機能キックオフせずに表示されますので、ここで

@RestController 
@RequestMapping (value = "/") 
@RequiresUser 
public class RootEndpoint { 

    @RequestMapping (method = RequestMethod.GET) 
    public String doGet() throws Exception { 
    return "{ \"hello\": \"world\" }"; 
    } 
} 

を私の質問があり

  1. Q1私の設定には何がありますか?可能であれば、私はXML構成を避けようとしています。
  2. Q2基本を取得した後、ユーザーを別のページにリダイレクトするのではなく、例外をスローするために使用できるのは何ですか?私は自分のカスタムShiroFilterFactoryBeanが必要ですか?

答えて

1

実際にコードの所有者が許可したSpring Bootに切り替えることで、これを動作させることができました。

@ExceptionHandler ({ 
    AuthenticationException.class, 
    UnknownAccountException.class, 
    UnauthenticatedException.class, 
    IncorrectCredentialsException.class, 
    UnauthorizedException.class} 
) 
@ResponseStatus (value = HttpStatus.UNAUTHORIZED) 
@ResponseBody 
public RestApiErrorResponse handleUnauthorized() { 
    return build(HttpStatus.UNAUTHORIZED); 
} 
:私も含まれる @ControllerAdvice実装を追加することにより、例外およびカスタム・リターン・データを使用するためにカスタムハンドラを追加

@Configuration 
public class ShiroConfiguration { 

    @Bean 
    public ShiroFilterFactoryBean getShiroFilter() { 
    ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); 
    factoryBean.setSecurityManager(getSecurityManager()); 
    return factoryBean; 
    } 

    @Bean (name = "securityManager") 
    public DefaultWebSecurityManager getSecurityManager() { 
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); 
    securityManager.setRealm(getLocaleRealm()); 
    securityManager.setSessionManager(getSessionManager()); 
    return securityManager; 
    } 

    @Bean 
    public DefaultWebSessionManager getSessionManager() { 
    final DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); 
    sessionManager.setGlobalSessionTimeout(43200000); 
    return sessionManager; 
    } 

    @Bean (name = "localRealm") 
    @DependsOn ("lifecycleBeanPostProcessor") 
    public LocalRealm getLocaleRealm() { 
    return new LocalRealm(); 
    } 

    @Bean (name = "lifecycleBeanPostProcessor") 
    public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() { 
    return new LifecycleBeanPostProcessor(); 
    } 

    @Bean 
    public MethodInvokingFactoryBean getMethodInvokingFactoryBean() { 
    MethodInvokingFactoryBean factoryBean = new MethodInvokingFactoryBean(); 
    factoryBean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager"); 
    factoryBean.setArguments(new Object[]{getSecurityManager()}); 
    return factoryBean; 
    } 
} 

:私は最終的に、このように見えた史郎のためのコンフィギュレーションクラスに巻き上げ

関連する問題