開発モードの Spring セキュリティ事前認証
-
21-08-2019 - |
質問
アプリケーションの開発中、さまざまなロールを持つさまざまなユーザーとしてすばやくログインして、アプリケーションがどのように表示されるかを確認できると非常に便利です。
ユーザー名を入力したり、パスワードを入力したりするのは楽しいことではなく、時間の無駄です。私がやりたいことは次のとおりです。
- 使用可能なユーザー名のリストを含むページ/パネルを追加します。
- ユーザー名をクリックすると、Spring セキュリティのイベントが生成され、パスワードを入力しなくてもユーザーが認証済みであると認識できるようになります。
- リンクをクリックすると、指定されたユーザーとして認証されます。
注::パスワードはハッシュ化され、フォームを使用してプレーンテキストで送信されるため、リンク内のパスワードをエンコードすることはできません。
明らかに この機能は開発時にのみ存在します。
どうすればこれを達成できますか?
解決
私は、Webアプリケーションのために、このようにそれを行っている。
私は(もちろん唯一の開発サーバーでの)サーバーのcontext.xml
で構成パラメータを持っています。このパラメータは、ユーザー名とパスワードの昏睡区切りリストが含まれています。
(JSP(x))を単に追加のフォームを追加し、各ユーザ名のための送信ボタンをログインページには、パスワードアイテムは、コンテキストパラメータを形成します。したがって、ユーザーは、事前定義されたログインデータと通常のログインプロセスがtriggedされたボタンをクリックした場合。
サーバのcontext.xml
...
<Context>
...
<Parameter name="quickLogin"
value="admin:passwd,user:otherPasswd"
override="false" />
</Context>
login.jspx
...
<!-- Login for debugging purposes -->
<c:forTokens items="${initParam.quickLogin}" delims="," var="loginPassword">
<c:set var="login" value="${fn:split(loginPassword, ':')[0]}" />
<c:set var="password" value="${fn:split(loginPassword, ':')[1]}" />
<form name="debugLogin" action="${form_url}" method="POST" >
<crsf:hiddenCrsfNonce/>
<input type="hidden" name='j_username' value="${fn:escapeXml(login)}" />
<input type="hidden" name='j_password' value="${fn:escapeXml(password)}" />
<input type="submit" value="${fn:escapeXml(login)} login" />
</form>
</c:forTokens>
...
他のヒント
開発モード用InMemoryDaoImplを使用してください。メモリに格納されているユーザーおよびパスワードを作成することは非常に簡単です。
<bean id="userDetailsService" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
<property name="userMap">
<value>
admin=admin,ROLE_ADMIN,ROLE_USER
user1=user1,ROLE_USER
user2=user2,ROLE_USER
</value>
</property>
</bean>
開発モードでは、認証プロバイダにこれを注入します。本番では、適切なDBまたはLDAP実装で置き換えます。
私はあなたには、いくつかの特定のURLが要求された場合SpringSecurityは、自動的にユーザーを認証したいと思います(と、あなたのパネル/ページでこのURLへのリンクを持っているでしょう)理解でます。
どのようにカスタムフィルタを書くことについてます:
public class YourSpecialDevelopmentTimeFilter
extends AuthenticationProcessingFilter
implements SyncSecurityFilter
....
それがオーバーライドします:
protected boolean requiresAuthentication(
HttpServletRequest request, HttpServletResponse response)
とrequest
でいくつかのパラメータに依存してtrueを返す?
もちろん、他の関心事は、本番環境でこの機能を持っているではありません。それは、のDEV のために異なるコードベースを持っていることは常に危険なものであるとのPROD の