spring security 测试自定义logout,发生重定向

项目场景:

项目集成spring security,测试自定义的退出方法,结果与预期不符。


问题描述

自定义了退出方法logout,测试时控制台打印的日志显示NONE_PROVIDED(String),返回结果提示未登录(自定义了AuthenticationEntryPoint)。
在这里插入图片描述控制台打印结果:

2023-02-25 14:06:03.893 DEBUG 48388 --- [nio-8080-exec-6] com.example.hours.dao.UserDao.selectOne  : ==>  Preparing: SELECT id,nickname,password,mobile,sign,email,header,gender,authority,del_flag,create_time,update_time FROM user WHERE del_flag=0 AND (nickname = ?)
2023-02-25 14:06:03.893 DEBUG 48388 --- [nio-8080-exec-6] com.example.hours.dao.UserDao.selectOne  : ==> Parameters: NONE_PROVIDED(String)
2023-02-25 14:06:03.894 DEBUG 48388 --- [nio-8080-exec-6] com.example.hours.dao.UserDao.selectOne  : <==      Total: 0

自定义 AuthenticationEntryPoint,处理未登录情况

/**
 * 用户未登录
 */
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
    	// ResultCodeEnum.UNAUTHORIZED(401, "暂未登录或token已经过期")
        Result<Object> failedResult = Result.failed(ResultCodeEnum.UNAUTHORIZED);
        String s = JSON.toJSONString(failedResult);
        WebUtils.renderString(response, s);
    }
}

原因分析:

返回结果发现是ResultCodeEnum.UNAUTHORIZED,可以确定走了自定义的login方法。

接下来从自定义的JwtAuthenticationTokenFilter开始 debug,一直到过滤器链走完,依然没找到原因,观察整个过滤器链,决定从LogoutFilter开始调试,
在这里插入图片描述
当执行到this.logoutSuccessHandler.onLogoutSuccess(request, response, auth);时,调用了SimpleUrlLogoutSuccessHandleronLogoutSuccess方法,
在这里插入图片描述
继续进入,发现调用了AbstractAuthenticationTargetUrlRequestHandlerhandle方法,
在这里插入图片描述
观察targetUrl,发现其值为/login?logout,接下来看到sendRedirect,就找到原因了,在这里重定向到了/login(如果配置了loginPage,则重定向到loginPage),随后发起了登录请求,所以最后结果提示未登录。


解决方案:

方案一:

更改请求地址,将@PostMapping("/logout")改成@PostMapping("/my_logout")

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想要基于Spring Security的CAS登录重定向到特定路径,可以通过以下步骤实现: 1. 在Spring Security配置文件添加以下代码,以配置CAS登录: ``` <http> <intercept-url pattern="/secure/**" access="ROLE_USER" /> <logout logout-success-url="/logout.jsp" /> <custom-filter ref="casAuthenticationFilter" /> </http> <authentication-manager> <authentication-provider ref="casAuthenticationProvider" /> </authentication-manager> <beans:bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter"> <beans:property name="authenticationManager" ref="authenticationManager" /> <beans:property name="authenticationSuccessHandler"> <beans:bean class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"> <beans:property name="defaultTargetUrl" value="/secure/index.jsp" /> </beans:bean> </beans:property> </beans:bean> <beans:bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider"> <beans:property name="userDetailsService" ref="userService" /> <beans:property name="serviceProperties" ref="serviceProperties" /> <beans:property name="ticketValidator"> <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator"> <beans:constructor-arg index="0" value="https://localhost:8443/cas" /> </beans:bean> </beans:property> <beans:property name="key" value="casAuthenticationProviderKey" /> </beans:bean> <beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties"> <beans:property name="service" value="https://localhost:8443/myapp/j_spring_cas_security_check" /> <beans:property name="sendRenew" value="false" /> </beans:bean> <beans:bean id="userService" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> <beans:property name="userDetailsService" ref="inMemoryUserService" /> </beans:bean> <beans:bean id="inMemoryUserService" class="org.springframework.security.core.userdetails.memory.InMemoryDaoImpl"> <beans:property name="userProperties"> <beans:value> casuser=123456,ROLE_USER </beans:value> </beans:property> </beans:bean> ``` 2. 在 `SavedRequestAwareAuthenticationSuccessHandler` 设置默认目标URL,如上面的示例所示,将其设置为 `/secure/index.jsp`。 3. 然后,您可以在您的应用程序使用重定向来将用户重定向到特定路径。例如,您可以使用以下代码在控制器方法将用户重定向到 `/myapp/home`: ``` return "redirect:/myapp/home"; ``` 注意,这将导致用户被重定向到CAS服务器进行身份验证,然后将其重定向回 `/myapp/home`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值