LoginSignup
2
2

More than 5 years have passed since last update.

Spring-securityでユーザーログイン後とかにリダイレクトさせる方法

Posted at

ある一定の条件をDBから取得して、条件に一致するならば指定された画面にリダイレクトするような画面が作りたいとする。

そんなとき、Spring-securityを使っているならばカスタムフィルターが使える。フィルターを定義して、そのクラスの中でリダイレクトを実行させればよい。

Spring-securityで定義されるフィルターの種類

Spring-securityでフィルターを差し込めるタイミングは以下の一覧に載っている。

使いそうなもの

  • CSRF_FILTER
  • LOGOUT_FILTER
  • FORM_LOGIN_FILTER
  • FILTER_SECURITY_INTERCEPTOR

カスタムで作成したフィルターは、上記の前にも後にも、もしくはそのフィルター自体の代替として定義できる。

spring-security.xml
<http>
    <!-- 前 -->
    <custom-filter before="FORM_LOGIN_FILTER" ref="myFilter" />
    <!-- それ自体の代わりとして -->
    <custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
    <!-- 後 -->
    <custom-filter after="FORM_LOGIN_FILTER" ref="myFilter" />
</http>

フィルター自体の定義方法

Springのフィルターは GenericFilterBean を使ったほうがいいようだ。プロジェクトの適当なところに、このクラスを継承したクラスを定義する。

そして、そのクラスの名前空間とSpring上でのidをXMLに設定する。そうすることで、spring-securityで使用するためだ。

spring-context.xml
<beans:bean id="myFilter" class="org.baeldung.security.filter.CustomFilter"/>

二重Dispatchを防ぐために

こういうプロジェクト全体的にかかわるフィルターを書くと、Strutsとかでかつてよく見た二重Dispatchのエラーが出る。こんなの:

java.lang.IllegalStateException: Cannot forward after response has been committed

要は、行き先が決まっているリクエストをフィルターでもう一度リダイレクトしようとするとこれが起こる。

対処としては、前述の Table 6.1. Standard Filter Aliases and Ordering を見て、リクエストの行き先が決まる前に所望のフィルター処理を実行することだ。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2