Spring Security +容器管理身份验证问题

时间:2014-05-15 17:01:03

标签: java spring java-ee spring-security

我正在使用Spring Security Framework + Spring MVC来构建安全的Web应用程序。我的用户的身份验证必须由我的容器处理。我按照这两个步骤来实现:

  1. 将我的整个应用程序保存在 web.xml 文件中:

    <login-config>
        <auth-method>FORM</auth-method>
    </login-config>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Public</web-resource-name>
            <description>Matches unconstrained pages</description>
            <url-pattern>/resources/*</url-pattern>
        </web-resource-collection>
    </security-constraint>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Secured Areas</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>Everyone</role-name>
        </auth-constraint>
    </security-constraint>
    

  2. 使用以下类设置Spring Security:

    @Configuration
    @EnableWebMvcSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/resources/**").permitAll()
                .anyRequest().authenticated()
            .and()
                .jee().mappableRoles("Admin", "User");
    }
    

    }

  3. 这个配置似乎有效,因为每当我尝试访问应用程序上下文中的任何URL(静态资源(在/ resources /文件夹中))时,我都必须进行身份验证。然后在登录后,显示正确的URL和页面(如预期的那样)。但是,如果我尝试访问另一个链接,我必须再次登录。然后,显示正确的URL和页面,我可以访问任何链接,而无需再次登录。所以,我的问题是:为什么我必须登录两次才能不被要求再次登录?

1 个答案:

答案 0 :(得分:2)

我不是这个主题的专家,但我弄清楚的方式是会话可能是由容器和spring安全性创建的。我的容器身份验证由WebLogic处理。有一堆谷歌搜索结果显示如何为preauth编写自定义过滤器,但在我将Spring安全性更改为无状态之前,它似乎仍然无法正常工作。

<http auto-config="false" use-expressions="true" disable-url-rewriting="true"
    create-session="stateless" entry-point-ref="http403EntryPoint">