2

Spring MVC、Tiles、Shiro を使用しています。

これは、私のauthorizedUrlプロパティがどのように構成されているかです: <property name="unauthorizedUrl" value="/unauthorized"/>

私の期待は、MyAuthorizingRealm無効な資格情報が見つかった場合、Shiro が にリダイレクトすること/unauthorizedです。

しかし、それはフォーム送信時に私には起こりません。@ControllerのGET および POST アクションを処理するようにマップされたログインがあります/login。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";
    }
}

AuthenticationExceptionから投げても、MyAuthorizingRealm.doGetAuthenticationInfo()シロを にリダイレクトさせることはできません/unauthorized。常にフィルタ チェーンを続行し、@Controller;で POST メソッドを実行します。もちろん、代わりにリダイレクトを期待しています。

これが私のものwebapp-context.xmlです: http://pastebin.com/XZaCKqEC

そして、これが私のものweb.xmlです: http://pastebin.com/5H81Tm8A

以下は、Shiro からの TRACE ログ出力の一部です。にアクセスしようとすると、Shiro が動作します/lists。ただし、ログインフォームが送信されると、リダイレクト/unauthorizedは発生しません。ログインの送信が検出されることに注意してください: http://pastebin.com/ZEK3CTdJ

そのため、ログインの送信は検出されますが、元のフィルター チェーンは、リダイレクトする代わりに実行されます。/unauthorized

私は困惑しています。助けてくれてありがとう。さらに情報が必要な場合はお知らせください。

4

1 に答える 1

3

私は2つの問題があると思います:

1) spring xml のペーストビンには、レルムで構成されている SecurityManager が表示されません。つまり、次のようにする必要があります。

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

2) 認証を実行するように Spring MVC コントローラーをセットアップしています。これsubject.loginは、Shiro の組み込み FormAuthenticationFilter ( ) に依存せずに、いつ呼び出されるかを制御する必要があることを意味しますauthc

これを行う場合、authcフィルターを PassThruAuthenticationFilterに再定義する必要があります。

これにより、リクエストがフィルタ チェーンを通過して、subject.login の呼び出しを担当するログイン ビュー/コントローラに到達できるようになります。

filtersプロパティを設定authcし、構成されたフィルターの名前として使用することにより、spring.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>

また、ヒントとして、Shiro の WebUtils を使用して、ログインにリダイレクトされる前にエンドユーザーを最初に試行した URL にリダイレクトすることをお勧めします。Shiro'sFormAuthenticationFilterはこれを自動的に行いますが、自分でログインを実行する場合、必要に応じてこのリダイレクトを実行する責任があります。

たとえば、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
于 2012-04-26T17:48:20.917 に答える