2015-09-11 148 views
1

我想使用spring安全进行身份验证,但是当我尝试访问站点时,出现所有请求中的404错误。我试图调试这几天,但没有为我工作。Spring Security 404错误

这里是我的web.xml:

<!-- Spring MVC --> 
<servlet> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring-database.xml, 
     /WEB-INF/spring-security.xml 
    </param-value> 
</context-param> 

<!-- Spring Security --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

弹簧security.xml文件:

<context:component-scan base-package="com.example.users.service"/> 

<http auto-config="true" use-expressions="true" authentication-manager-ref="authManager"> 
    <intercept-url pattern="/j_spring_security_check" access="permitAll"/> 
    <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')" /> 

    <access-denied-handler error-page="/403" /> 
    <form-login 
     login-page="/login" 
     default-target-url="/welcome" 
     authentication-failure-url="/login?error" 
     username-parameter="username" 
     password-parameter="password" /> 
    <logout logout-success-url="/login?logout" /> 
    <csrf /> 
</http> 

<authentication-manager id="authManager"> 
    <authentication-provider user-service-ref="myUserDetailsService" /> 
</authentication-manager> 

弹簧database.xml:

<tx:annotation-driven transaction-manager="transactionManager"/> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/test" /> 
    <property name="username" value="root" /> 
    <property name="password" value="12345678" /> 
</bean> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
    <property name="packagesToScan" value="com.example.users.model"/> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

和MVC-调度员的servlet .xml:

<context:component-scan base-package="com.example.*" /> 

<bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix"> 
     <value>/WEB-INF/pages/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
</bean> 

任何帮助将不胜感激。

谢谢。

+0

当你删除Spring Security时,你会得到404吗? – luboskrnac

+0

不,我得到这个错误,当试图添加弹簧安全春天MVC – Dmitriy

回答

1

我们不知道你用的是什么版本的春季安全的,但如果你有4.X.X那么这个网址将不起作用:/j_spring_security_check。他们已将其更改为/登录。

Here is the docs.

我觉得这个配置应该做的伎俩:

<http auto-config="true" use-expressions="true" authentication-manager-ref="authManager"> 
    <form-login 
      login-page="/login" 
      default-target-url="/welcome" 
      always-use-default-target="true" 
      authentication-failure-url="/login?error" 
      username-parameter="username" 
      password-parameter="password"/> 
    <access-denied-handler error-page="/403" /> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/> 
    <intercept-url pattern="/login" access="permitAll"/> 
    <logout logout-success-url="/login?logout" /> 
    <csrf /> 
</http> 
+0

我使用3.2.3.RELEASE版本的春季安全。但是我的项目的所有网址都有404错误。 – Dmitriy

+0

是否需要升级? – Wermerb

+0

我尝试使用4.0.1.RELEASE,结果相同。 – Dmitriy

0

假设德米特里现在可能已经解决了这个,我回答的希望,它可能是其他人谁偶然发现有用在这个问题上。

  1. 我找不到spring mvc dispatcher servlet config xml。
  2. 如果弹簧配置中已经注意到了,我们不需要特别在弹簧安全xml配置中添加组件扫描。
  3. 可能不需要intercept-url pattern =“/ j_spring_security_check”access =“permitAll”。 Spring安全性非常聪明,它只会对所提到的url模式应用安全性。所有其他网址都可以免费访问。
  4. 根据Spring安全版本,应该在表单动作中使用/ j_spring_security_check或/ login url。前者用于Spring 3.x,后者用于Spring 4.x
  5. form-login中的登录页面属性必须通过控制器映射或xml映射与Spring mvc应用程序中的url匹配。
  6. 最后,重要的是,如果你陷入困境,在春季安全XML一个配置,春天就会让你运行的应用程序,但它总是会导致404所以一定要确保你有所有URL映射到控制器的映射,所有页面可以在spring mvc应用程序中解析。

例如,如果access-denied-handler error-page =“/ 403”元素找不到/ 403映射,那么虽然用户被成功验证和授权,但会导致404错误。

如果调试春季安全框架如何将所有的过滤器正在工作,你可以看到你的应用程序是如何表现。

<i><debug/></i> element in spring security can help. 

请让我知道这是否有帮助。