mysql 权限控制详解

概述

mysql权限控制在不同的上下文和不同的操作水平上都可以进行控制,他们包括如下几个

** 管理权限可以允许用户管理mysql server的操作。这些权限控制是全局的,不是针对某个特定的数据库的

** 数据库权限对应到一个数据库和里面的对象。这些权限被用来控制特定的数据库或者全局的,他们能够应用到所有的数据库

** 数据库对象的权限对应到数据库表,索引,视图,和存储过程,可以对数据库内部的某个对象进行授权控制。

权限的存储位置

** 账号权限信息被存储在mysql数据库的user,db,tables_priv ,columns_priv ,procs_priv 表中。

** mysql启动的时候读取这些信息到内存中去,或者在权限变更生效的时候,重新读取到内存中去

mysql 账号管理

mysql 账号名字由用户名和主机名组成。这样可以允许同已用户在不同主机上分别控制权限。这一部分描述如何分配账户名字包括特定的值和模糊

匹配规则,在sql语句中,create user, grant ,set password的时候,会用到这些规则:

- ‘user_name’@’host_name’ 就是账户名字的语法规则

- 仅仅包含用户名的账号等同于 ‘username’@’%’

- 如果用户名是合法的字符,用户名和主机名不必用引号引起来。在你的用户名包含’-‘这样的字符的时候,需要用引号引起来。或者说主机名有

通配符的时候需要引起来。

- 引号可以用单引号也可以用双引号。

- 主机和用户名必须分别被引号括起来,如果必须要括的话。

mysql在mysql数据库中分别用两个列去存储用户名和主机名:

- 用户表每个账户一行记录,次表也表示了账号有哪些全局权限。

- 其他授权表表示了账号拥有的数据库和数据库内的对象。这些表都有用户名和主机列。每行的账户信息和user表的账户信息是奕扬的。

用户名和主机名可以包含特殊字符或者通配符,下面是这些规则:

用户名要么是一个非空字符串字面上必须匹配连接字符串中指名的用户名,或者一个空字符串就会匹配人户用户名。空用户名是一个匿名用户。

主机名也可以又好多形式,或者通配符:

- 主机名可以是一个IP地址或者一个localhost样的字符串。

- %和sql中的like的效果是一样的。例如 ’%.mysql.com’ 就会匹配 a.mysql.com.

权限控制阶段1:连接校验

当你尝试去连接到mysql服务器,服务器基于下面两点条件去接受或者拒绝连接:

- 你的身份标识以及正确的密码

- 你的账号是否被锁定了

服务器先校验密码是否正确,然后校验是否锁定。任何一个步骤失败,服务器将会拒绝连接。如果通过教研,服务器接受连接,然后进入第二阶段

并且等候请求。

认证检查线检查user表的三个列,host,user,password。锁定状态是在user表的account_locked列中记录着的。账号锁定状态可以通过alter user

语句来变更。

你的身份由两部分来组成,你连接的客户主机以及你的mysql用户名。如果用户名不空,则必须全字符匹配才可以,如果用户名是空的,则匹配

任何用户。如果用户表匹配到一个空用户名,这个用户被认为是一个匿名用户,二不是客户实际提供的。这意味着空用户名是用来进一步检查用的

也就是阶段2.

密码可以为空,这个不是一个通配符,不意味着匹配任何密码。它的意思是用户必须无密码连接。如果服务起授权一个客户都安使用一个插件,这样

该插件实现的认证体系或许没有用密码列。在这样的情况下,外部密码也可以用来去认证mysql服务器。

非空密码都是加密存储的,mysql没有存储任何明文密码。并且,用户提供的密码也是被加密的。这个加密的密码后来在连接过程中,来检查密码是

否正确。

从mysql的观点来看,加密的密码才是真正的密码,所以不要告诉任何人这个加密的密码。

如果在user表中有多行被匹配,服务器必须决定用哪一个,它的规则是这样的:

- 任何时候服务器读取用户表到内存中的时候,它会排序。

- 服务器检查的伺候服务器按行顺序去检查

- 服务器使用第一个匹配的行

服务器排序的规则是字面的在前面,统配的在后面。

权限控制阶段2:请求校验

当通过了连接校验,你和服务器建立了连接后,服务器进入权限控制的第二个阶段。你的每个请求,服务器决定出你想做什么操作,然后检查你是否有

权限去做。此时,grant 表的privilege列就该出场了。这些列可以出自 user,db,tables_priv,columns_priv,procs_priv。不再细讲这些表了。

什么时候去权限变更生效

当服务器启动的时候,grant表的数据被读入内存。如果你使用账户管理语句去更新权限控制,服务器将会知道这些变更,然后重新读取它们。如果你

直接用sql语句去更新这些表,你的变更不会生效知道你重新启动服务器或者你告诉服务器去重建缓存。

你可以通过执行一个刷新权限操作来通知服务器重建缓存。下面三个语句都可以达到效果:

- flush_privileges

- mysqladmin_flush-privileges

- mysqladmin_reload

如果启动参数是 –skip-grant-tables ,那么服务器不再校验任何权限,很不安全。

时间: 2024-10-08 20:47:01

mysql 权限控制详解的相关文章

thinkphp基于角色的权限控制详解

一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通过成为适 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. array( 'APP_AUTOLOAD_PATH'=>'@.TagLib', 'SESSION_AUTO_START'=>类型 1 登录认证 2

MySQL主从架构详解

1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收

MySQL配置文件mysql.ini参数详解、MySQL性能优化

MySQL配置文件mysql.ini参数详解.MySQL性能优化 my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section.   Client Section用来配置MySQL客户端参数.   要查看配置参数可以用下面的命令: show variables like '%innodb%'; # 查看innodb相关配置参数 show status like

(转) shiro权限框架详解06-shiro与web项目整合(上)

http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springMVC+mybatis,所以我们是基于搭建好的项目进行改造的. 将shiro整合到web应用中 登录 退出 认证信息在页面展现,也就是显示菜单 shiro的过滤器 将shiro整合到web应用中 数据库脚步 sql脚步放到项目中,项目上传到共享的资源中,文章最后给出共享url. 去除项目中不使用shi

MySQL的binlog详解(转)

MySQL的binlog详解 什么是binlog binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句.语句以"事件"的形式保存,它描述数据更改. binlog作用 因为有了数据更新的binlog,所以可以用于实时备份,与master/slave复制 和binlog有关参数 log_bin 设置此参数表示启用binlog功能,并指定路径名称 log_bin_index 设置此参数是指定二进制索引文件的路径与名称 binlog_

Yahoo的MySQL性能分析器详解

Yahoo的MySQL性能分析器详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.介绍 Yahoo于前日开源了自己的MySQL性能分析器(MySQL Performance Analyzer),源码托管在GitHub.此性能分析器使用Maven构建,需要JDK 8和Maven 3.0. 此性能分析器项目包含了两个子项目: 1)Java Web应用项目:myperf 2)Jetty Web服务器项目:jetty wrapper 虽然项目在pom

Mysql 配置参数详解以及优化配置

mysql有以下几种日志: 错误日志:   log-err 查询日志:   log 慢查询日志:  log-slow-queries 更新日志:   log-update 二进制日志: log-bin 要把日志生成在 /var/log 目录下(是系统日志存放的地方,只有 root 账号有写权限),需要 MySQL进程对这个目录有读写权限,一般是不这么做的,也考虑到安全问题,包括 MySQL 本身的数据安全,因为对 MySQL 的所有操作,都会记录到常规查询日志.MySQL的日志就不要用 /var

mysql触发器用法详解

MySQL触发器语法详解: 触发器 trigger是一种特殊的存储过程,他在插入(inset).删除(delete)或修改(update)特定表中的数据时触发执行,它比数据本身标准的功能更精细和更复杂的数据控制能力.触发器不是由程序调用,而是由某个事件来触发的.在有数据修改时自动强制执行其业务规则,经常用于加强数据的完整性约束和业务规则等.触发器可以查询其他表,而且包含复制的sql语句.触发器也可用于强制引用完整性.触发器可以强制比用check约束定义的约束更为复杂的约束. (一).CREATE

Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响 Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解 Mysql加锁过程详解(6)-数据库隔离级别(1) Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别 Mysql加锁过程详解