2016-09-20 294 views
4

我正在尝试在我的项目中集成Spring Security。为什么Spring Security不起作用?

我按照这里给出的文档: https://spring.io/guides/gs/securing-web/

相反的春天开机,我一直在使用XML配置好了一切。

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

是的,我正在使用3.0我不知道如何在我的应用程序中使用此过滤器链代理,你能给我一个示例代码为我的应用程序? –

回答

1

您必须注册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。这可以在Servlet 3.0+环境中支持Spring的WebApplicationInitializer的Java配置中完成。不出所料,Spring Security提供了一个基类AbstractSecurityWebApplicationInitializer,它将确保springSecurityFilterChain获得您的注册。

+0

我试着通过扩展基类'AbstractSecurityWebApplicationInitializer'来注册'springSecurityFilterChain',但它说'没有名为'springSecurityFilterChain'的bean被定义了' –

+0

是的,我也试过了,但是当我做这个文件时tomcat并没有启动,错误'无法启动'。是的,我的配置是在com.name.ot.conf –

+0

您可以请添加日志。它应该工作。也许这个问题给你一个提示:http://stackoverflow.com/questions/37543489/no-bean-named-springsecurityfilterchain-is-defined-error-in-spring-java-based – dur

1

我有同样的问题。

我的解决方案与Craig Walls p247的“Spring in action”一书中提到的一样。您需要创建一个扩展AbstractSecurityWebApplicationInitializer的空类。

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {} 
相关问题