GVKun编程网logo

MySQL:关于 unauthenticated user(mysql: unrecognized service)

1

最近很多小伙伴都在问MySQL:关于unauthenticateduser和mysql:unrecognizedservice这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展'St

最近很多小伙伴都在问MySQL:关于 unauthenticated usermysql: unrecognized service这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展'Stream' 类型的值不能从函数 'user' 返回,因为它的返回类型是 'Stream?'、CDH:cdh5 环境 mkdir: Permission denied: user=root, access=WRITE, inode="/user":hdfs:hadoop:...、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?、Django 认证 —— 自定义 User 模型和在 adminsite 中创建 User等相关知识,下面开始了哦!

本文目录一览:

MySQL:关于 unauthenticated user(mysql: unrecognized service)

MySQL:关于 unauthenticated user(mysql: unrecognized service)

 

一、现象

在生产环境中我们偶尔会遇到show processlist;显示host为 unauthenticated user 这样的连接,同时伴有数据库服务器层面的load,sys cpu较高,或者thread running异常。

二、分析

类似于校园门卫看到一个陌生的人进入学校,对TA提出的哲学式问题:TA是谁?从哪里来? 要干什么?本文从IT技术角度回答这个哲学问题。

TA是谁?

官方介绍:

unauthenticated user refers to a thread that has become associated with a client connection but for which authentication of the client user has not yet been done。

意即:MySQL有一个线程在处理客户端的连接,但是该客户端还没通过用户验证,show processlist时显示"unauthenticated user"。
1

从哪里来?

回答这个问题之前,我们先了解client端和MySQL建立TCP连接(socket不在讨论范围之内)的过程,一般客户端建立与MySQL的连接分4步:

  1. 客户端发送数据包到MySQL服务器,准备建立连接。如果MySQL服务器对应的端口没有运行,则客户端会直接收到报错信息:

    ERROR 2003 (HY000): Can''t connect to MySQL server on ''[host]'' (111)

  2. MySQL服务器向客户端响应基本信息 数据库服务器的ip,port,mysqld version,the thread id,客户端的host,port等等,此时连接已经建立但是尚未完成授权。

    “When a new client connects to mysqld, mysqld spawns a new thread to handle the request. This thread first checks whether the host name is in the host name cache. If not, the thread attempts to resolve the host name: The thread takes the IP address and resolves it to a host name (using gethostbyaddr()). It then takes that host name and resolves it back to the IP address (using gethostbyname()) and compares to ensure it is the original IP address.”

    实际连接过程是 mysql 分配一个新的线程来处理客户端的连接请求。先检查客户端的hostname 是否在缓存中,如果不在则对hostname解析。先作反向解析客户端IP --> 客户端的hostname,然后作客户端的hostname --> 客户端IP的正向解析。如果结果符合,则验证为合法用户允许登录,如果不符合则定义为"unauthenticated user"。

  3. 客户端发送username/password/要访问的dbname到MySQ数据库服务器。如果客户端由于某些原因在connect_timeout规定的时间内没有发送包或者发送错误的包,数据库服务器会断开该连接。
  4. 服务器验证并返回验证结果给客户端。如果验证不通过 则通常返回: 

    ERROR 1045 (28000): Access denied for user ''user''@''host'' (using password: [YES/NO])

ok,至此,我们可以知道TA来自客户端和MySQL服务器建立连接的第二阶段过程中。

 

要做什么?

显然此类连接是要访问数据库,准备获取数据或者写入数据。但是我们如何规避这样的三无人员的出现呢? 从该问题产生的原因来分析,主要的解决方法如下:
  • 在 /etc/my.cnf 的[mysqld]中添加

    skip-name-resolve

    参数,关闭mysql的dns反查询,mysql使用IP或者%授权。

  • 在 /etc/hosts 添加IP与主机名对应关系

    192.168.0.1 xxxx

值得注意的是在我们生产环境中已经为MySQL配置了skip-name-resolve,依然会出现大量unauthenticated user 的连接时,表明MySQL服务器没有为客户端连接请求确认凭证,也就是说MySQL无法确认这些连接使用的数据库账号信息,在wait_timeout时间之内MySQL一直等待这些连接完成。 比如我在某机器上执行

telnet x.x.x.x 3306

目标机器上 MySQL中执行

mysql>show processlist;

有一个连接显示为unauthenticated user 。 因此这种现象不一定就是数据库本身的问题,下面这些都有可能产生这种现象:
  1. 如果由于应用安全问题出现大量数据库探测,出现大量这种未经授权的连接。
  2. 应用服务压力过大出现线程异常中断导致出现大量异常数据库连接。
  3. 应用服务到db服务器的网络异常,客户端由于某些参数配置不正确致使正常的请求没有在规定时间内发出,MySQL无法验证连接的有效性。
  4. MySQL客户端连接版本问题,验证协议不兼容,尤其注意old-password验证方式。
  5. 数据库服务器的线程处于排队状态,因此可以加大back_log,增加MySQL处理连接请求的能力。

前三种情况要从应用服务器端查看系统的负载或者应用程序的状态,后面两个要从数据库服务器层面来检查系统的状态。

三、参考

  • 《Troubleshooting Problems Connecting to MySQL》

  • 《what is an unauthenticated user》

  • back_log 官方说明

  • connection-threads 官方说明

  • host-cache 官方说明

'Stream<User?>' 类型的值不能从函数 'user' 返回,因为它的返回类型是 'Stream<User>?'

'Stream' 类型的值不能从函数 'user' 返回,因为它的返回类型是 'Stream?'

如何解决''Stream<User?>'' 类型的值不能从函数 ''user'' 返回,因为它的返回类型是 ''Stream<User>?''?

我在 auth.authStateChanges() 上看到了红线, 错误说:无法从函数“user”返回“Stream”类型的值,因为它的返回类型为“Stream?”。

class Auth {
  final FirebaseAuth auth;

  Auth({required this.auth});

  Stream<User>? get user => auth.authStateChanges(); <-- here

现在更新我收到此错误:

Future<String?> createAccount({required String email,required String password}) async {
    try {
      await auth.createuserWithEmailAndPassword( <-- here **auth**
        email: email.trim(),password: password.trim(),);
      return "Success";
    } on FirebaseAuthException catch (e) {
      return e.message;
    } catch (e) {
      rethrow;
    }
  }

解决方法

这是你更新的课程

import ''package:firebase_auth/firebase_auth.dart'';

class Auth {
  final FirebaseAuth auth;

  Auth({required this.auth});

  Stream<User?> get user => auth.authStateChanges();

  Future<String?> createAccount({required String email,required String password}) async {
    try {
      await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: email.trim(),password: password.trim(),);
      return "Success";
    } on FirebaseAuthException catch (e) {
      return e.message;
    } catch (e) {
      rethrow;
    }
  }
}

CDH:cdh5 环境 mkdir: Permission denied: user=root, access=WRITE, inode=

CDH:cdh5 环境 mkdir: Permission denied: user=root, access=WRITE, inode="/user":hdfs:hadoop:...

产生问题原因:

环境 hadoop2,cdh5 创建
使用 hadoop fs -mdkir /use/xxx 创建文件路径时,出现权限问题

前提我们已经把当前用户 zhangsan 和 root 放到 /etc/suders 中。

su root

vi /etc/sudoers
root ALL=(ALL) ALL
zhangsan ALL=(ALL) NOPASSWD:ALL

su zhangsan
[zhangsan@cdh107 ~]$ hadoop fs -ls /user
Found 7 items
drwxrwxrwx - mapred hadoop 0 2018-11-12 14:07 /user/history
drwxrwxr-t - hive hive 0 2018-11-12 14:09 /user/hive
drwxrwxr-x - hue hue 0 2018-11-12 14:09 /user/hue
drwxrwxr-x - impala impala 0 2018-11-12 14:09 /user/impala
drwxrwxr-x - oozie oozie 0 2018-11-12 14:09 /user/oozie
drwxr-x--x - spark spark 0 2018-11-12 15:14 /user/spark
drwxrwxr-x - sqoop2 sqoop 0 2018-11-12 14:08 /user/sqoop2

创建目录 /user/zhangsan 抛出异常:

[zhangsan@cdh107 ~]$ hadoop fs -mkdir /user/wangyou
mkdir: Permission denied: user=zhangsan, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
[zhangsan@cdh107 ~]$ sudo hadoop fs -mkdir /user/wangyou
mkdir: Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x

解决步骤:

1. 查看 /user 目录的用户和用户组

[zhangsan@cdh107 ~]$ hadoop fs -ls /
Found 3 items
drwxr-xr-x - hbase hbase 0 2018-11-12 14:59 /hbase
drwxrwxrwt - hdfs supergroup 0 2018-11-12 14:09 /tmp
drwxr-xr-x - hdfs supergroup 0 2018-11-12 14:09 /user

备注:从上边可以看出我们想在 /user 路径下创建用户,但是 /user 路径的用户是 hdfs,用户组是 supergroup,当我们使用 zhangsan 或者 root 时提示创建失败,因此我们要修改创建 /user/wangyou 的用户。

2. 使用 hdfs 这个用户登录来创建目录 /user/wangyou

[zhangsan@cdh107 ~]$ sudo -uhdfs hadoop fs -mkdir /user/wangyou
[zhangsan@cdh107 ~]$ hadoop fs -ls /user
Found 8 items
drwxr-xr-x - hdfs supergroup 0 2018-11-13 16:43 /user/wangyou
drwxrwxrwx - mapred hadoop 0 2018-11-12 14:07 /user/history
drwxrwxr-t - hive hive 0 2018-11-12 14:09 /user/hive
drwxrwxr-x - hue hue 0 2018-11-12 14:09 /user/hue
drwxrwxr-x - impala impala 0 2018-11-12 14:09 /user/impala
drwxrwxr-x - oozie oozie 0 2018-11-12 14:09 /user/oozie
drwxr-x--x - spark spark 0 2018-11-12 15:14 /user/spark
drwxrwxr-x - sqoop2 sqoop 0 2018-11-12 14:08 /user/sqoop2

3. 通过 hdfs 用户更改所在用户的权限

[zhangsan@cdh107 ~]$ sudo -uhdfs hadoop fs -chown zhangsan:zhangsan /user/wangyou
[zhangsan@cdh107 ~]$ hadoop fs -ls /user
Found 8 items
drwxr-xr-x - zhangsan zhangsan 0 2018-11-13 16:43 /user/wangyou
drwxrwxrwx - mapred hadoop 0 2018-11-12 14:07 /user/history
drwxrwxr-t - hive hive 0 2018-11-12 14:09 /user/hive
drwxrwxr-x - hue hue 0 2018-11-12 14:09 /user/hue
drwxrwxr-x - impala impala 0 2018-11-12 14:09 /user/impala
drwxrwxr-x - oozie oozie 0 2018-11-12 14:09 /user/oozie
drwxr-x--x - spark spark 0 2018-11-12 15:14 /user/spark
drwxrwxr-x - sqoop2 sqoop 0 2018-11-12 14:08 /user/sqoop2

 如果 spark2-shell 出现这个错误,如何解决参考《问题解决:Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x

 

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#Restart=on-failure
#RestartPreventExitStatus=1
#PrivateTmp=false

这里的

[Service]

User=mysql

Group=mysql,

user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?还是其他呢?

Django 认证 —— 自定义 User 模型和在 adminsite 中创建 User

Django 认证 —— 自定义 User 模型和在 adminsite 中创建 User

步骤如下:

一:在 settings 中指定用户模型

AUTH_USER_MODEL = ''authentication.CustomUser''

authentication 为 app 的名字,CustomUser 为自定义的用户模型

二:定义用户模型和管理器

在 authentication/models.py 中 ,代码如下

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
from django.utils import timezone


class CustomUserManager(BaseUserManager):

    def create_user(self, email, password):
        """Create a user"""
        if not email:
            raise ValueError("邮箱地址不能为空")

        user = self.model(email=self.normalize_email(email),
                          last_login=timezone.now())
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        """Create a superuser"""
        user = self.create_user(email, password)
        user.is_admin = True
        user.save(using=self._db)
        return user


class CustomUser(AbstractBaseUser):
    email = models.EmailField(primary_key=True, max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    objects = CustomUserManager()

    USERNAME_FIELD = ''email''

    class Meta:
        pass

    def get_full_name(self):
        pass

    def get_short_name(self):
        pass

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

三:迁移数据库

在命令行中输入 python manage.py makemigrations, python manage.py migrate

注意:在定义自定义用户模型之前要保证以前没执行过以上命令

四:创建 admin

命令行输入 python manage.py createsuperuser

五:使用 adminsite 创建 User

在 authentication/admin.py 中,代码如下

from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField

from .models import CustomUser


class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(widget=forms.PasswordInput)
    password2 = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = CustomUser
        fields = (''email'',)

    def clean_password2(self):
        password1 = self.cleaned_data.get(''password1'')
        password2 = self.cleaned_data.get(''password2'')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError(''密码不正确'')
        return password2

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data[''password1''])
        if commit:
            user.save()
        return user


class UserChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = CustomUser
        fields = (''email'', ''password'')

    def clean_password(self):
        return self.initial[''password'']


class UserAdmin(BaseUserAdmin):
    form = UserChangeForm
    add_form = UserCreationForm

    list_display = (''email'', ''is_admin'')
    list_filter = (''is_admin'',)
    fieldsets = (
        (None, {''fields'': (''email'', ''password'')}),
        (''Personal info'', {''fields'': (''last_login'',)}),
        (''Permissions'', {''fields'': (''is_admin'',)}),
    )
    add_fieldsets = (
        (None, {
            ''classes'': (''wide'',),
            ''fields'': (''email'', ''last_login'', ''password1'', ''password2'')}
         ),
    )
    search_fields = (''email'',)
    ordering = (''email'',)
    filter_horizontal = ()

# Now register the new UserAdmin
admin.site.register(CustomUser, UserAdmin)
admin.site.unregister(Group)

现在就能使用 adminsite 创建用户了

引用用户模型

不要直接使用自定义的用户模型,这里就是 CustomUser。相反应该使 django.contrib.auth.get_user_model() ,该函数会返回当前指定的用户模型。

当在一个模型中定义外键或多对多关系要使用 CustomUser 模型时,使用 settings.AUTH_USER_MODEL

 

 

我们今天的关于MySQL:关于 unauthenticated usermysql: unrecognized service的分享已经告一段落,感谢您的关注,如果您想了解更多关于'Stream' 类型的值不能从函数 'user' 返回,因为它的返回类型是 'Stream?'、CDH:cdh5 环境 mkdir: Permission denied: user=root, access=WRITE, inode="/user":hdfs:hadoop:...、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?、Django 认证 —— 自定义 User 模型和在 adminsite 中创建 User的相关信息,请在本站查询。

本文标签: