在开发应用程序时,能够以具有不同角色的不同用户身份快速登录以查看应用程序如何呈现自己是非常有用的。
输入用户名和输入密码不好玩,而且浪费时间。我想做的是:
- 添加一个包含可用用户名列表的页面/面板;
- 单击用户名将为 Spring 安全性生成一个事件,该事件允许它识别用户已通过身份验证,而无需输入密码;
- 单击链接后,我被认证为指定用户。
注意:密码被散列并使用表单以纯文本形式提交,因此在链接中对密码进行编码不是一种选择。
显然,此功能只会在开发时出现。
我怎样才能做到这一点?
在开发应用程序时,能够以具有不同角色的不同用户身份快速登录以查看应用程序如何呈现自己是非常有用的。
输入用户名和输入密码不好玩,而且浪费时间。我想做的是:
注意:密码被散列并使用表单以纯文本形式提交,因此在链接中对密码进行编码不是一种选择。
显然,此功能只会在开发时出现。
我怎样才能做到这一点?
使用 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 实现替换它。
我已经为 Web 应用程序这样做了:
我在context.xml
服务器中有一个配置参数(当然只在开发服务器中)。此参数包含一个逗号分隔的用户名和密码列表。
登录页面 (jsp(x)) 只需为上下文参数中的每个用户名、密码项添加一个额外的表单和提交按钮。因此,如果用户单击该按钮,则会触发具有预定义登录数据的正常登录过程。
服务器上下文.xml
...
<Context>
...
<Parameter name="quickLogin"
value="admin:passwd,user:otherPasswd"
override="false" />
</Context>
登录.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,您希望 SpringSecurity 自动对您进行身份验证(并且您的面板/页面中会有指向此 URL 的链接)。
如何编写自定义过滤器:
public class YourSpecialDevelopmentTimeFilter
extends AuthenticationProcessingFilter
implements SyncSecurityFilter
....
这将覆盖:
protected boolean requiresAuthentication(
HttpServletRequest request, HttpServletResponse response)
并根据request
?中的某些参数返回 true
当然,另一个问题是在生产环境中没有这个功能。为dev和prod拥有不同的代码库总是有风险的。