ssm整合spring-security遇到的404错误、一直重定向于登入界面的错误

1. 404错误

1.1 第一种可能

如果你设置的登入页面是.html页面,则会出现404的问题。因为spring-security要操作页面,都是请求springmvc得到的。spring-security要跳转到login-page="/login.html",会给springmvc发送/login.html的请求,而html是静态资源,默认springmvc不允许访问静态资源。如果你不在spring-mvc.xml配置文件中设置允许该静态资源允许被访问,则会找不到资源。

所以,在spring-mvc.xml配置文件中编写一下代码:

<mvc:resources location="/login.html" mapping="/login.html"/>

然后就可以访问资源了。不过个人建议用jsp比较好。

1.2 第二种可能

没有在spring-security.xml中设置csrf:<security:csrf disabled="true"/>,其位置如下:

<security:http auto-config="true" use-expressions="false">
        <!-- 配置资料连接,表示任意路径都需要ROLE_USER权限 -->
        <security:intercept-url pattern="/**" access="ROLE_USER"/>
        <security:form-login
                login-page="/pages/login.jsp"
                login-processing-url="/login"
                username-parameter="username"
                password-parameter="password"
                authentication-failure-url="/pages/failure.jsp"
                default-target-url="/pages/success.jsp"
                always-use-default-target="true"
                />
        <security:logout invalidate-session="true" logout-url="/logout"
                         logout-success-url="/login.jsp"/>

        <!-- 关闭CSRF,默认是开启的 -->
        <security:csrf disabled="true"/>
    </security:http>

2. 页面上显示错误“重定向请求过多”

你用spring-security拦截了所有的请求,但是,请求登入界面的请求不应该被拦截,不然就陷入了死循环,一直重定向,造成此错误。
应该设置:<security:http security="none" pattern="/pages/login.jsp"/>,表示不过滤某些请求,其位置如下:

<!-- 配置不过滤的资源(静态资源及登录相关) -->
<security:http security="none" pattern="/pages/login.jsp"/>

<security:http auto-config="true" use-expressions="false">
    <!-- 配置资料连接,表示任意路径都需要ROLE_USER权限 -->
    <security:intercept-url pattern="/**" access="ROLE_USER"/>
    <security:form-login
            login-page="/pages/login.jsp"
            login-processing-url="/login"
            username-parameter="username"
            password-parameter="password"
            authentication-failure-url="/pages/failure.jsp"
            default-target-url="/pages/success.jsp"
            always-use-default-target="true"
            />
    <security:logout invalidate-session="true" logout-url="/logout"
                     logout-success-url="/login.jsp"/>

    <!-- 关闭CSRF,默认是开启的 -->
    <security:csrf disabled="true"/>
</security:http>

3. 无论登入成功还是失败一直重定向在登入界面

3.1 第一个可能

出现这个原因,你应该和我一样用的是jsp文件,我都网上翻了各种资料,找了好几个小时,没找到。第二天自己无意间把错误找到了:

在登入的login.jsp页面中,登入的请求必须要绝对请求路径,不能用相对请求路径:

必须这样:
<form action="${pageContext.request.contextPath}/login" method="post">

不能这样:
<form action="login" method="post">

3.2 第二个可能

登陆界面的请求与login-processing-url请求的名字不一样:

<form action="${pageContext.request.contextPath}/login" method="post">

login-processing-url="/login"

这里 action="${pageContext.request.contextPath}/XXX" 和 login-processing-url="/XXX"
这里的XXX必须一致

这样基本上没有问题了。

3. 最后附上我的spring-security的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd">

    <!-- 配置不过滤的资源(静态资源及登录相关) -->
    <security:http security="none" pattern="/pages/login.jsp"/>
    <security:http security="none" pattern="/pages/failure.jsp"/>

    <security:http auto-config="true" use-expressions="false">
        <!-- 配置资料连接,表示任意路径都需要ROLE_USER权限 -->
        <security:intercept-url pattern="/**" access="ROLE_USER"/>

        <!-- 自定义登陆页面
            login-page 登陆页面
            login-processing-url : 发送登陆请求数据的url
            authentication-failure-url 用户权限校验失败后后才会跳转到这个页面,
            default-target-url 登陆成功后跳转的页面。
            always-use-default-target: true 适用于后台管理系统,防止访问历史记录
                                       false 适用于前台页面,提升用户体验
        -->
        <security:form-login
                login-page="/pages/login.jsp"
                login-processing-url="/login"
                username-parameter="username"
                password-parameter="password"
                authentication-failure-url="/pages/failure.jsp"
                default-target-url="/pages/success.jsp"
                always-use-default-target="true"
                />

        <!-- 登出:
            invalidate-session 是否删除session
            logout-url:登出处理链接
            logout-successurl:登出成功页面
            注:登出操作 只需要链接到 logout即可登出当前用户
        -->
        <security:logout invalidate-session="true" logout-url="/logout"
                         logout-success-url="/login.jsp"/>

        <!-- 关闭CSRF,默认是开启的 -->
        <security:csrf disabled="true"/>
    </security:http>

    <!-- 在内存中构造用户们 -->
    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="user" password="{noop}user" authorities="ROLE_USER"/>
                <security:user name="admin" password="{noop}admin" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Security在Spring Boot中的多模块配置可以通过以下步骤实现。 1. 首先,确保你的项目是一个多模块项目。可以使用Maven或Gradle来创建多模块项目结构。 2. 在主模块中,引入Spring Security的Starter依赖。这可以通过在pom.xml或build.gradle文件中添加相应的依赖项来完成。 3. 创建一个子模块来处理安全相关的功能。这可以是一个专门的子模块,也可以是主模块中的一个子包。 4. 在安全子模块中,创建一个配置类来配置Spring Security。这个类应该扩展WebSecurityConfigurerAdapter,并通过@EnableWebSecurity注解启用Spring Security。 5. 在配置类中,可以使用注解来定义安全规则,例如 @EnableGlobalMethodSecurity、@Configuration、@EnableWebSecurity等。 6. 根据你的需求,可以在配置类中配置身份验证和授权规则,例如配置用户认证、授权访问规则以及定义登录页面等。 7. 可以在子模块中创建控制器和服务类来处理具体的安全操作,例如登录、注册、权限管理等。 总结来说,通过创建一个独立的子模块来处理Spring Security的功能,可以更好地组织和管理安全相关的代码。这样做可以使代码更加清晰、可维护,并且可以更好地与其他模块进行解耦。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [springboot-security模块搭建](https://blog.csdn.net/zyj1051574045/article/details/124786444)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [(微服务多模块)Springboot+Security+Redis+JWT 仅需一招](https://blog.csdn.net/white_mvlog/article/details/127589924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值