我正在尝试将Spring Security集成到我的项目中。
我已按照此处提供的文档: https://spring.io/guides/gs/securing-web/
我使用XML配置了所有内容,而不是Spring Boot。
我的web.xml
是:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
dispatcher-servlet.xml
:
<context:component-scan base-package="com.name.ot" />
<bean id="resolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
我的视图控制器是:
@Controller
public class HomeController{
@RequestMapping(value={"/", "/home"}, method = RequestMethod.GET)
public ModelAndView home() {
ModelAndView model = new ModelAndView("home");
return model;
}
@RequestMapping(value={"/hello"}, method = RequestMethod.GET)
public ModelAndView hello() {
ModelAndView model = new ModelAndView("hello");
return model;
}
@RequestMapping(value={"/login"}, method = RequestMethod.GET)
public ModelAndView login() {
ModelAndView model = new ModelAndView("login");
return model;
}
}
我的安全级别:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
但是,我可以访问所有网页/
,/home
,/hello
,/login
。
我不希望用户直接访问/hello
,而无需进入/login
。
我做错了什么?
答案 0 :(得分:9)
我遇到了同样的问题。
我的解决方案如Craig Walls p247的“Spring in action”一书所述。您需要创建一个扩展AbstractSecurityWebApplicationInitializer的空类。
public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {}
答案 1 :(得分:3)
您必须注册Filter Chain Proxy。
对于XML配置,请参阅Spring Security Reference:
使用servlet过滤器时,显然需要在
web.xml
中声明它们,否则servlet容器将忽略它们。在Spring Security中,过滤器类也是在应用程序上下文中定义的Spring bean,因此能够利用Spring丰富的依赖注入工具和生命周期接口。 Spring的DelegatingFilterProxy
提供了web.xml
与应用程序上下文之间的链接。使用
DelegatingFilterProxy
时,您会在web.xml
文件中看到类似内容:<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
对于Java配置和Servlet API 3+,请参阅Spring Security Reference:
下一步是在战争中注册
springSecurityFilterChain
。这可以在Java配置中使用Spring的WebApplicationInitializer
支持在Servlet 3.0+环境中完成。并不令人惊讶的是,Spring Security提供了一个基类AbstractSecurityWebApplicationInitializer
,可确保springSecurityFilterChain
为您注册。