1

Shiro を dropwizard webapp に統合しています。というところまで来ました

  • shiro は認証が必要なリソースを認識し、ログイン ページ (/auth/login) に移動します。
  • 間違ったパスワード (/auth/login?loginFailed=true) が原因でログインが失敗した場合、shiro が警告してくれます。
  • shiro は、保護されたリソース (/admin/** など) にアクセスしようとした場合にのみリダイレクトします
  • 成功すると、shiro は定義されたページにリダイレクトします

ただし、保護されたリソースにアクセスしようとすると、ログインしているかどうかに関係なく、shiro によって常にログイン ページが表示されます。ログインは機能していると思います。また、私がログインしているかどうかにかかわらず、shiro は尊重していないと思います。

私のshiro.ini:

[main]
# some other stuff
authc = org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter
authc.loginUrl = /auth/login

# NOTE: URLs are evaluated in order, and the first matching pattern is accepted.
[urls]
/static/** = noSessionCreation, anon
/auth/** = authc
/admin/** = authc
/** = anon

また、次のようなエラーが表示されます

0:0:0:0:0:0:0:1%0 - - [10/Oct/2013:18:23:54 +0000] "GET /auth/login;JSESSIONID=65e06b39-30e5-45dd-85f9-b2a1c29fc3af HTTP/1.1" 200 739 4 4
WARN  [2013-10-10 18:24:08,485] com.sun.jersey.spi.container.servlet.WebComponent:
A servlet request, to the URI http://blah:8080/auth/login, contains form
parameters in the request body but the request body has been consumed by the servlet
or a servlet filter accessing the request parameters. Only resource methods using
@FormParam will work as expected. Resource methods consuming the request body by other
means will not work as expected.

/admin にアクセスするたびに、エラー 302 が発生します。この問題に答えるために、他に何が関連しているのかわかりません。他にも「Shiro がログインにリダイレクトし続ける」という質問をいくつか調べましたが、ほとんどの場合、Dropwizard が使用しない web.xml を使用して Jetty を直接参照しており、適用されているフィルターもわかりません。私の同僚は、同じ方法を使用して、shiro をドロップウィザード プロジェクトで作業させました。

ユーザーをログインページに送るかどうかを決定する前に、shiro はユーザーをどのように認証しますか?

4

1 に答える 1

1

問題が見つかりました。shiro.ini の詳細、特にセッション管理部分は次のとおりです。

sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
# NOTE: The session ID cookie seems to be required in order for authentication to work as intended.
# If the presence of cookies is a deal-breaker, further investigation will be required.
# Here we enable the Secure attribute (serve over SSL only) for this cookie;
# the HttpOnly attribute (not accessible by JavaScript) is enabled by default.
#sessionManager.sessionIdCookie.secure = true
# enabled Ehcache following advice from Shiro docs
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionManager.sessionDAO = $sessionDAO
# can optionally add session listeners here if actions need to be performed on session start/stop/expiration
# sessionManager.sessionListeners = $listener_1, $listener_2, ...
securityManager.sessionManager = $sessionManager

sessionIdCookie.secure にコメントを付けました (すぐに削除します)。ssl を有効にしないと、変数が true に設定されていると Cookie が保存されないことがわかりました。これは、URL バーの JSESSIONID クエリ パラメータを説明していますが、認証後すぐに私のことを忘れて、再度ログインする必要があると判断した理由も説明しています。

于 2013-10-10T20:25:12.613 に答える