我正在使用Spring Security Framework + Spring MVC来构建安全的Web应用程序。我的用户的身份验证必须由我的容器处理。我按照这两个步骤来实现:
将我的整个应用程序保存在 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>
使用以下类设置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");
}
}
这个配置似乎有效,因为每当我尝试访问应用程序上下文中的任何URL(静态资源(在/ resources /文件夹中))时,我都必须进行身份验证。然后在登录后,显示正确的URL和页面(如预期的那样)。但是,如果我尝试访问另一个链接,我必须再次登录。然后,显示正确的URL和页面,我可以访问任何链接,而无需再次登录。所以,我的问题是:为什么我必须登录两次才能不被要求再次登录?
答案 0 :(得分:2)
我不是这个主题的专家,但我弄清楚的方式是会话可能是由容器和spring安全性创建的。我的容器身份验证由WebLogic处理。有一堆谷歌搜索结果显示如何为preauth编写自定义过滤器,但在我将Spring安全性更改为无状态之前,它似乎仍然无法正常工作。
<http auto-config="false" use-expressions="true" disable-url-rewriting="true"
create-session="stateless" entry-point-ref="http403EntryPoint">