Spring Security 404错误

时间:2015-09-11 18:30:23

标签: spring-mvc spring-security http-status-code-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-dispatcher-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>

非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

我们不知道您使用的是哪个版本的Spring Security,但如果您有4.X.X,则此网址无法正常工作:/j_spring_security_check。他们已将其更改为/ login。

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>

答案 1 :(得分:0)

假设Dmitriy现在可能已经解决了这个问题,我正在回答希望它可能对那些偶然发现这个问题的人有用。

  1. 我找不到spring mvc dispatcher servlet config xml。
  2. 我们不需要在spring security xml配置中特别添加组件扫描,如果已经在弹簧配置中进行了处理。
  3. intercept-url pattern =&#34; / j_spring_security_check&#34;存取=&#34; permitAll&#34;可能不是必需的。 Spring安全是智能的,它只会对所提到的url模式应用安全性。所有其他网址都可以免费访问。
  4. 根据Spring安全版本,应在表单操作中使用/ j_spring_security_check或/ login url。前者用于Spring 3.x,后者用于Spring 4.x
  5. form-login中的login-page属性必须通过控制器映射或xml映射与spring mvc应用程序中的url匹配。
  6. 最后,重要的是,如果你在spring security xml中弄乱了一个配置,spring会让你运行app但它总是会产生404.所以确保你把所有url映射到controller映射,所有页面可以在spring mvc应用程序中解析。
  7. 例如,如果access-denied-handler error-page =&#34; / 403&#34;如果用户通过身份验证并成功授权,则元素无法找到/ 403映射,则会导致404错误。

    如果您调试spring安全框架所有过滤器的工作方式,您可以看到应用程序的行为方式。

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-3">
    <div class="panel panel-default">
        <div class="panel-body">
            Panel
        </div>
    </div> 
    </div> 
    </div> 
    </div> 
    

    如果有帮助,请告诉我。