Spring Security 3:防止特定URL上的身份验证过滤器

时间:2013-12-17 16:56:33

标签: java spring spring-mvc cookies spring-security

我遇到有关Spring Security 3的一些身份验证问题。在我的Web应用程序中,用户没有通过常规表单登录。用户进入另一个他们登录的Web应用程序,从那里他们可以访问打开我的Web应用程序主页面的链接。请注意,所有这些架构都在同一家公司内,用户数据库对所有应用程序都是通用的。 另一个Web应用程序通过POST数据发送已登录的用户名,我可以通过request.getParameter("username")获取。处理该URL post请求的控制器使用以下代码获取用户名并强制该用户登录:

List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(usuario.getRole());
UserDetails userDetails = new User(usuario.getLogin(), "undefined", authorities);
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);

其他相关代码是applicationContext-security.xml

<http use-expressions="true">
        <intercept-url pattern="/ShowDocuments" access="permitAll"/>
        <intercept-url pattern="/AddDocForm" access="hasRole('ROLE_ADMIN')"/>
        <access-denied-handler error-page="/AccessDenied"/>
        <http-basic/>

        <session-management invalid-session-url="/InvalidSessionURL" session-authentication-error-url="/SessionAuthenticationErrorURL">
            <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" 
                                 expired-url="/ExpiredURL" />
        </session-management>
        <logout delete-cookies="JSESSIONID" invalidate-session="false"/>
    </http>
    <authentication-manager></authentication-manager>

问题是,当任何用户第一次访问我的主页面时,他们会被重定向到“invalidSessionURL”。尽管这不是我想要的,但这是我应该期待的,因为任何用户第一次尝试访问我的安全上下文中的任何页面时,它必须通过身份验证过程和过滤器,并且此时系统不会有任何方法来识别该用户。如果我按照这个程序,就会发生这种情况:

  1. 我清理浏览器可能存储的所有临时文件。
  2. 我打开ShowDocuments URL,这是我的主页面(在我的测试环境中,一旦控制器处理请求,此操作会强制模拟用户登录)。
  3. 显示“invalidSessionURL”。
  4. 如果我不清理浏览器的临时文件,但我的cookie已过期(在我的测试环境中,其有效期设置为1分钟),同样的事情发生,因为cookie不再有效。

    问题如下:当有人进入我的主页“ShowDocuments”时,有没有办法避免Spring Security检查身份验证?我试过这个<http pattern="/ShowDocuments" security="none"/>没有成功......

2 个答案:

答案 0 :(得分:0)

我在登录页面遇到了同样的问题,在路径中添加了whildcard解决了我的问题:

<intercept-url pattern="/login**" access="permitAll()" />

答案 1 :(得分:0)

您可以使用PreAuthenticatedProcessingFilter从请求中获取用户参数。在您的AuthenticationManager中,指定PreAuthenticatedAuthenticationProvider,使用AuthenticationUserDetailsService在共享数据库中查找用户详细信息。

您确实应该使用一种安全机制,让受信任的身份验证服务器断言它已检查用户的凭据。