我目前有一个WP站点设置,安装了一个独特的“multisite”插件,专门用于WooCommerce产品的一个管理区域,但有两个不同的前端,基于两个不同的域,具有不同的主题。
其中一个站点是“批发”站点,而另一个是“零售”站点。批发网站只允许交易客户进行购买。问题在于这两个站点共享一个域,因此用户帐户。
问题:我需要确保,如果没有用户角色“trade_customer”的用户尝试登录批发网站,则会选中该角色并注销该用户,并将其重定向到带有通知的登录页面。到目前为止,我有以下函数。php:
function trade_customers_only() {
function get_user_role() {
global $current_user;
$user_roles = $current_user->roles;
$user_role = array_shift($user_roles);
return $user_role;
}
$the_current_role = get_user_role();
echo $the_current_role;
if( $the_current_role != 'administrator' ) {
$logout_url = wp_login_url().'?mode=tradeonly';
wp_destroy_current_session();
wp_logout();
wp_redirect( $logout_url, 302 );
exit();
}
}
add_action('wp_login', 'trade_customers_only');
// CUSTOM LOGIN MESSAGES
function my_login_message() {
if( $_GET['mode'] == 'tradeonly' ){
$message = '<p class="message"><b>You must be a Trade Customer to access this site.</b></p>';
return $message;
}
}
add_filter('login_message', 'my_login_message');
此代码当前为:将登录用户返回到wp登录。php并添加注释“您必须是贸易客户…等等”。但是,在使用任何用户角色进行第一次登录尝试后,每一次其他登录尝试都会执行相同的重定向并显示消息。我的代码是否不正确,或者数据库或浏览器中是否存在导致WP认为我没有使用管理员帐户的问题的WP会话cookie?
我第一次尝试登录是使用管理员帐户。它工作了,并转到仪表板。下一次尝试是使用客户角色帐户。发生重定向和注释错误。以下使用管理员帐户的尝试仅使用Notes重定向,但没有仪表板访问权限。
我已经测试了以下代码是否正常工作。
无需运行wp\u destroy\u current\u session()
或wp\u logout()
,只需返回一个错误,它将中断身份验证并在登录页面上显示错误消息。
您可能必须确保优先级是最后一个(在本例中为100),以便在用户完全登录之前,现有过滤器wp\u authenticate\u username\u password
、wp\u authenticate\u email\u password
和wp\u authenticate\u spam\u check
都会执行它们的操作,然后拒绝。
/* Only allow administrators to login */
add_filter( 'authenticate', 'my_admin_check', 100, 1 );
function my_admin_check( $user ) {
// Make sure this is a real login attempt, without errors
if ( !is_wp_error($user) ) {
$user_role = $user->roles[0];
// add or remove the roles you want to allow/disallow (can be a custom role or regular WordPress roles)
if ( !in_array( $user_role, array( 'trade_customer' ) ) ){
return new WP_Error( 'login_failed', __( "Only staff can use this login.", "mysite_domain" ) );
} else {
// allow the login
return $user;
}
} else {
// We're just loading the login page, not running a login.
return $user;
}
}
我的新完整代码现在是:
function trade_customers_only($login, $user) {
if( $user->roles && !in_array('administrator',$user->roles)) {
$logout_url = wp_login_url().'?mode=tradeonly';
wp_destroy_current_session();
wp_logout();
wp_redirect( $logout_url, 302 );
exit();
}
}
add_action('wp_login', 'trade_customers_only',10,2);
// CUSTOM LOGIN MESSAGES
function my_login_message() {
if( $_GET['mode'] == 'tradeonly' ){
$message = '<p class="message"><b>You must be a Trade Customer to access this site.</b></p>';
return $message;
}
}
add_filter('login_message', 'my_login_message');
此代码工作正常。然而,正如Kulivov Sergey在他的回复中提到的,使用authenticate过滤器而不是wp_登录操作更适合我需要实现的功能。使用:
add_filter('authenticate',function($user,$username) {
if (!is_wp_error($user)) {
$auth_user=get_user_by('login',$username);
if ($auth_user && !in_array('administrator',$auth_user->roles)) {
return new WP_Error('authentication_failed', '<p class="message"><b>You must be a Trade Customer to access this site.</b></p>');
}
}
return $user;
},100,2);
不仅可以在不登录和创建会话的情况下检查用户角色,还可以让用户保持在当前页面上,而无需重定向,这非常好。
1)更改trade_customers_only功能:
function trade_customers_only($login, $user) {
if( $user->roles && !in_array('administrator',$user->roles)) {
$logout_url = wp_login_url().'?mode=tradeonly';
wp_destroy_current_session();
wp_logout();
wp_redirect( $logout_url, 302 );
exit();
}
}
并修复您的行动电话:
add_action('wp_login', 'trade_customers_only',10,2);
2) 另一种解决方案是使用身份验证过滤器,而不是使用wp_登录操作。区别在于,在设置用户会话之前检查用户的角色,因此不需要销毁它。
add_filter('authenticate',function($user,$username) {
if (!is_wp_error($user)) {
$auth_user=get_user_by('login',$username);
if ($auth_user && !in_array('administrator',$auth_user->roles)) {
return new WP_Error('authentication_failed', '<p class="message"><b>You must be a Trade Customer to access Key Essentials. Are you looking for <a href="https://lovetillys.co.uk" title="Love Tillys">Love Tillys?</a></b></p>');
}
}
return $user;
},100,2);
现在,我只想让那些已经注册并用我们的软件验证过的用户登录,我已经将用户的电子邮件列表(去掉特殊字符)保存在Firebase内部。当前,当用户登录时,我使用以下功能检查他们的邮件是否在此列表中: 虽然这种方法起作用,但它相当笨拙,因为用户仍然能够在函数回调被调用之前进行初始登录,并且他们的电子邮件仍然显示在FireBase中的“Authentication”选项卡中。 有没有更好的方法只允许预先验证
登录帧 菜单框架
我想配置一个cassandra角色/用户,该角色/用户只登录并“查看”特定的键空间/表。 以下是我的测试设置: 现在,我的角色“role_test”只能查询keypace“keyspace_test”,而不能查询其他键空间,这没关系,但是“role_test”可以登录并描述其他键空间,尽管它不能做任何事情,我真的想阻止这种情况。 有什么建议吗?
用户已作为用户角色登录,我想以员工身份登录而不提交登录表单,但身份验证失败, 请查一下密码,帮帮我 @requestmapping(value=“/home”)public ModelAndView userHomePage(Model Model,HttpServletRequest request,HttpServletResponse response,Principal Principal
我正在使用FireBase实时数据库来设置一个简单的CRUD应用程序。 我正在设置规则,以便只有登录的用户才能写入请求部分。我一定是误会了奥特。uid。 在请求中,我设置了,但我无法写入数据。 我错过了什么?
问题内容: 在MySQL中,我有一个用户芒果。当我创建它时,用户可以完美地工作。但是,重新启动计算机后,尝试登录芒果会产生以下输出: 这让我想起了密码哈希,因此在调查mysql.user之后,我发现mangos没有密码!我更新了密码: 现在,我得到: 与mangos的mysql.user密码栏中显示的数字相同,并且与原始数字不同。我仍然无法登录。 如何使MySQL正确识别密码? 这就是这里的问题吗