2

我正在使用 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");
        }
    }
}
4

1 回答 1

0

编辑:抱歉误导了你。我挖掘了一下,发现安全性不起作用,因为用户浏览器正在缓存 xxx.html 页面、js、css 等您可以:1)通过设置 html headers 强制刷新页面:这是最简单的解决方案,因为您使用的是安全的 RPC 服务这对你来说应该足够了。或者完全禁用缓存。

请注意它会增加您的网络流量。

2) 我们的应用程序正在检查 RPC 中是否出现安全错误:

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.InvocationException;

public abstract class CustomAsyncCallback<T> implements AsyncCallback<T> {
    @Override
    public void onFailure(Throwable caught) {
        if (caught instanceof InvocationException) {
            InvocationException ie = (InvocationException) caught;
            if(ie.getMessage().contains("j_spring_security_check")) {
                Window.alert("User session expired, please login again");
                Window.open(GWT.getHostPageBaseURL() + "login.jsp", "_self", null);
                return;
            }
        }
    }
}

您必须在某处调用它,即在显示您当前登录的用户时:

    userSecurityService.getUser(new CustomAsyncCallback<String>() {
        @Override
        public void onSuccess(String result) {
            usrLoginLbl.setText(result);
        }
    });

或者您可能会在您的 onFailure 方法之一中捕获此异常

于 2013-09-25T15:21:04.107 回答