2012-04-24 9 views
2

私はSpring MVC、Tiles、Shiroを使用しています。ShiroはunauthorizedUrlにリダイレクトされず、無効なログインになります - Shiro with Spring and Tiles

は、これは私のunauthorizedUrlプロパティが設定されている方法です。 <property name="unauthorizedUrl" value="/unauthorized"/>

私の期待はMyAuthorizingRealmが無効な資格情報を発見したとき、史郎が/unauthorizedにリダイレクトすることということです。

しかし、フォーム提出ではそれは起こりません。 /loginのGETアクションとPOSTアクションを処理するためにマップされているログイン@Controllerがあります。 URL /listsへのアクセスには、ログインフォームが表示されます。だから、あるケースでは動作するように見えるが、他のケースでは動作しないようだ。

@Controller 
@RequestMapping(value = "/login") 
public class LoginController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String getLoginFormView(Model model) { 
     return "login"; 
    } 

    // if this method doesn't exist a Post not supported exception is thrown 
    @RequestMapping(method = RequestMethod.POST) 
    public String handlePost() { 
     return "this view doesn't exist"; 
    } 
} 

私はMyAuthorizingRealm.doGetAuthenticationInfo()からAuthenticationExceptionを投げたとしても、私はまだ史郎/unauthorizedにリダイレクトすることができません。常にフィルタチェーンを終了し、@ControllerのPOSTメソッドを実行します。もちろん私はリダイレクトを期待しています。ここ http://pastebin.com/XZaCKqEC

され、私のweb.xmlhttp://pastebin.com/5H81Tm8A

史郎からいくつかのトレースログ出力がされた後

は、ここに私のwebapp-context.xmlです。 Shiroは/listsにアクセスしようとすると動作します。しかし、ログインフォームが送信されると、/unauthorizedへのリダイレクトは起こりません。注意、ログイン提出が検出された: http://pastebin.com/ZEK3CTdJ

ので、ログインの提出が検出されたが、元のフィルタ・チェーンではなく、私は困惑/unauthorized

にリダイレクトをとにかく実行されます。どんな助けでも多くのおかげです。さらに詳しい情報が必要なら私に知らせてください。

1)のSecurityManager は、レルムで構成されて表示されませんあなたの春のXMLのためのあなたのペーストビン:

答えて

3

は、私は二つの問題を参照してくださいと思います。私。それはこのように見える必要があります:あなたはあなたがに頼る呼び出されたときsubject.login制御しないようにする意味の認証を実行するためにSpring MVCのコントローラを設定している

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
    <property name="realm" ref="myRealm"/> 
</bean> 

2)史朗の内蔵FormAuthenticationFilter(authc )。

この場合、フィルタを PassThruAuthenticationFilterに再定義する必要があります。

これは、あなたがあなたの春のことを行うことができます subject.login

を呼び出すための責任があるあなたの ログインビュー/コントローラにフィルタチェーン「通過」に要求することができます。filtersプロパティを設定して、構成されたフィルタの名前としてauthcを使用して、XML:また

<bean id="passthruAuthcFilter" class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter"> 
    <property name="loginUrl" value="/login"/> 
</bean> 

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
    ... 
    <property name="filters"> 
     <util:map> 
      <entry key="authc" value-ref="passthruAuthcFilter"/> 
     </util:map> 
    </property> 
    ... 
</bean> 

、ヒントとして、あなたは彼らが最初に前に試みたURLにエンドユーザーをリダイレクトするために史郎さんWebUtilsを使用する場合がありますログインにリダイレクトされます。 ShiroさんのFormAuthenticationFilterはこれを自動的に実行しますが、ログインを自分で実行する場合は、必要に応じてこのリダイレクトを行う責任があります。たとえば、あなたのLoginControllerのhandlePost方法で

を:

subject.login(authcToken); 
WebUtils.redirectToSavedRequest(request, response, yourFallbackUrlIfThereIsntASavedRequest); 
return null; //tells Spring MVC you've handled the response, and not to render a view 
+0

申し訳ありませんが、私のセキュリティマネージャは、私の設定です。私はちょうどポストから何とかそれを省いた。 Shiroと一緒にSpring MVCの機能を同時に使用することはできないと言っているようです。言い換えれば、FormAuthenticationFilterとSpring MVCをタイルで同時に使用したいと思います。 FormAuthenticationFilterを使用している場合は、MVCフレームワークからかなりの機能を失うので、MVCコントローラーで実行できないと言っています。その場合、おそらく私はパススルーフィルタを使用し、ハンドルのログイン手順を自分で行う必要があります。 –

+0

また、あなたのフィードバックのおかげで本当に感謝しています。 –

関連する問題