WordPress自动登录后访问指定页自动登出功能代码异常排查
问题原因分析
- 跨请求状态丢失:你定义的
$autologin是函数内局部变量,自动登录逻辑执行完后直接跳转终止了本次请求。WordPress每个页面请求都会重新触发init钩子执行该函数,跳转后的新请求里$autologin会重新初始化,根本继承不到之前的赋值,甚至会因未定义抛出PHP通知。 - 条件判断语法错误:自动登出的条件中误用了赋值运算符
=而非比较运算符==,$autologin = true逻辑永远返回真,完全起不到校验作用。 - 变量赋值顺序错误:
$autologin = true写在了跳转逻辑之后,即使不考虑跨请求问题,也无法在本次请求后续逻辑中生效。
修复方案
核心是要通过跨请求可读取的存储介质保存「用户为自动登录」的状态,推荐用Cookie实现,改后代码如下:
/* AUTO LOGIN / LOGOUT */ function autologinout() { // Autologin if( isset($_GET['username']) ) { // 对输入参数做过滤,避免注入风险 $username = sanitize_text_field($_GET['username']); $user = get_user_by('login', $username); if ( !is_wp_error( $user ) && in_array( 'customer', (array) $user->roles ) ) { wp_clear_auth_cookie(); wp_set_current_user( $user->ID ); wp_set_auth_cookie( $user->ID ); // 设置自动登录标记Cookie,有效期默认1天,可自行调整 setcookie( 'is_auto_login', '1', time() + 86400, COOKIEPATH, COOKIE_DOMAIN ); wp_redirect( '/lovelists/toon-lovelist/' ); exit(); } } // Autologout $current_path = $_SERVER['REQUEST_URI']; $target_paths = ['/lovelists/maak-lovelist/', '/lovelists/login/']; if ( is_user_logged_in() && isset($_COOKIE['is_auto_login']) && $_COOKIE['is_auto_login'] === '1' && in_array($current_path, $target_paths) ) { wp_clear_auth_cookie(); wp_logout(); // 清除自动登录标记 setcookie( 'is_auto_login', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN ); } } add_action( 'init', 'autologinout' );
注意:当前直接通过GET参数传用户名实现自动登录存在极高安全风险,任何人都可以伪造参数登录任意客户账号,建议额外增加加密签名校验逻辑,验证参数合法后再执行自动登录。
内容的提问来源于stack exchange,提问作者BarrieO
相关产品推荐
相关产品推荐

