我正在使用 Spring Security 来保护对我的 GWT 的第一页应用程序"/HumanResources.html"的访问。它检查用户的凭据是否正确(通过将它们与 ldap 内容进行比较)并查看用户是否存在于数据库中(自定义授权表)。
第一次用户登录,没有问题,然后用户注销并显示“.jsp”页面。但是当他想再次访问“HumanResources.html”页面时,身份验证显然被忽略(不显示登录表单)并显示页面。只有接口是可见的,数据由安全的 RPC 服务检索。
此问题出现在外部 Tomcat 服务器上(在 Firefox 和 Chrome 上测试),但不在 GWT 开发模式下。CTRL + F5 似乎工作,我寻找其他缓存问题,但它没有帮助。
谁能帮我 ?
我的security-applicationContext.xml的一部分:
<http use-expressions="true" auto-config="false">
<intercept-url pattern="/HumanResources.html" access="isAuthenticated()" />
<form-login
login-page='/login.jsp'
authentication-failure-url = "/login.jsp?login_error=1"
authentication-success-handler-ref="HRAuthenticationHandler" />
<logout
logout-url="/logout"
logout-success-url="/logout.jsp"
delete-cookies="JSESSIONID"/>
</http>
<beans:bean id="HRAuthenticationHandler" class="lu.sfeir.candidate.server.auth.HRAuthenticationHandler">
<beans:property name="useReferer" value="true" />
</beans:bean>
<ldap-server url="${ldap.serverUrl}" manager-dn="${ldap.adminLogin}" manager-password="${ldap.adminPassword}" />
<authentication-manager>
<ldap-authentication-provider
group-search-base="${ldap.groups}"
user-search-base="${ldap.users}"
user-search-filter="${ldap.userId}">
</ldap-authentication-provider>
</authentication-manager>
和我的自定义AuthenticationHandler 实现:
public class HRAuthenticationHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Autowired
private AuthorizedUsersDao usersDao;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException,
ServletException {
// Check if the user exist in the DB
if(usersDao.findUser(((UserDetails)authentication.getPrincipal()).getUsername())) {
// Redirect to home page
super.onAuthenticationSuccess(request, response, authentication);
} else {
// Redirect to error page
response.sendRedirect("/spring_security_login?login_error");
}
}
}