在開發應用程序時,能夠快速以不同的用戶身份以不同的角色進行登錄以查看應用程序如何呈現自己,這是非常有用的。針對開發模式的Spring安全預認證
輸入用戶名和輸入密碼並不好玩,浪費時間。我想要做的是:
- 添加頁面/面板與可用的用戶名列表;
- 點擊用戶名會產生一個Spring安全事件,它允許它識別用戶身份驗證,而不需要輸入密碼;
- 點擊鏈接後,我被認證爲指定的用戶。
N.B.:密碼被散列並使用表單以純文本形式提交,因此不能將鏈接中的密碼編碼。
顯然此功能只會在開發時出現。
我該如何做到這一點?
在開發應用程序時,能夠快速以不同的用戶身份以不同的角色進行登錄以查看應用程序如何呈現自己,這是非常有用的。針對開發模式的Spring安全預認證
輸入用戶名和輸入密碼並不好玩,浪費時間。我想要做的是:
N.B.:密碼被散列並使用表單以純文本形式提交,因此不能將鏈接中的密碼編碼。
顯然此功能只會在開發時出現。
我該如何做到這一點?
我已經做了這樣一個Web應用程序:
我有一個配置參數在服務器中的context.xml
(當然只是在開發服務器)。該參數包含用逗號分隔的用戶名和密碼列表。
登錄頁面(jsp(x))只需添加一個額外的表單併爲每個用戶名,密碼項目提交按鈕從上下文參數。因此,如果用戶點擊該按鈕,則會觸發具有預定義登錄數據的正常登錄過程。
服務器上下文。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>
...
據我所知,如果請求某個特定的URL(並且您的面板/頁面中有此URL的鏈接),SpringSecurity會自動驗證您的身份。
如何編寫自定義過濾器:
public class YourSpecialDevelopmentTimeFilter
extends AuthenticationProcessingFilter
implements SyncSecurityFilter
....
能夠否定:
protected boolean requiresAuthentication(
HttpServletRequest request, HttpServletResponse response)
,並根據在request
一些參數返回true?
當然,另一個問題是在生產環境中不具備此功能。對於dev和prod有不同的代碼基礎是一件冒險的事情。
使用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>
在開發模式下,將其注入您的身份驗證提供程序。在生產中,用適當的數據庫或LDAP實施替換它。