私は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.xml
:
http://pastebin.com/XZaCKqEC
そしてここに私です web.xml
:
http://pastebin.com/5H81Tm8A
以下はShiroからのTRACEログ出力です。アクセスしようとするとShiroが動作します /lists
。しかし、ログインフォームが送信されたときにリダイレクトが /unauthorized
決して起こりません。ログインの送信が検出されたことに注意してください。
http://pastebin.com/ZEK3CTdJ
そのため、ログイン送信は検出されますが、元のフィルタチェーンはにリダイレクトされずに実行されます。 /unauthorized
私は困っています。どんな助けにも感謝します、そして、あなたがより多くの情報を必要とするならば、私に知らせてください。
回答:
回答№1の場合は32つの問題があると思います。
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
これは自動的に行われますが、自分でログインを実行するときには、必要に応じてこのリダイレクトを行う責任があります。
たとえば、 LoginController
s 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