/ / ShiroがunauthorizedUrlに無効なログインでリダイレクトしない - Shiro with Spring and Tiles - リダイレクト、spring-mvc、タイル、shiro

ShiroはunauthorizedUrlにリダイレクトされません - 無効なログイン - ShiroとSpringとTiles - リダイレクト、spring-mvc、タイル、shiro

私はSpring MVC、TilesとShiroを使っています。

これが私のunauthorizedUrlプロパティの設定方法です: <property name="unauthorizedUrl" value="/unauthorized"/>

私の期待は、 MyAuthorizingRealm Shiroがリダイレクトする無効な認証情報を見つけます /unauthorized.

しかし、それはフォーム送信時に私には起こりません。ログインしています @Controller それに対するGETおよびPOSTアクションを処理するためにマップされます。 /login。 URLへのアクセス /lists ログインフォームが表示されます。だからそれは1つのケースではうまくいくが、他のケースではうまくいかないようだ。

@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() 私はまだShiroにリダイレクトすることができません /unauthorized。それは常にフィルタチェーンを続けて終了し、POSTメソッドを @Controller;そしてもちろん私は代わりにリダイレクトを期待しています。

ここに私です webapp-context.xmlhttp://pastebin.com/XZaCKqEC

そしてここに私です web.xmlhttp://pastebin.com/5H81Tm8A

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

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

私は困っています。どんな助けにも感謝します、そして、あなたがより多くの情報を必要とするならば、私に知らせてください。

回答:

回答№1の場合は3

2つの問題があると思います。

1)春の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

あなたのspring.xmlの中でそれを行うことができます filters プロパティと使用 authc 設定したフィルタの名前として:

<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にリダイレクトすることもできます。 FormAuthenticationFilter これは自動的に行われますが、自分でログインを実行するときには、必要に応じてこのリダイレクトを行う責任があります。

たとえば、 LoginControllers 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