MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。

  1. mysql 的权限体系大致分为5个层级:
  2. 全局层级
  3. 全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。
  4. 数据库层级
  5. 数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.dbmysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。
  6. 表层级
  7. 表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_nameREVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
  8. 列层级
  9. 列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。
  10. 子程序层级
  11. CREATE ROUTINE, ALTER ROUTINE, EXECUTEGRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。
  12. 这些权限信息存储在下面的系统表中:
  13. mysql.user
  14. mysql.db
  15. mysql.host
  16. mysql.table_priv
  17. mysql.column_priv
  18. 当用户连接进来,mysqld会通过上面的这些表对用户权限进行验证!

一、权限表的存取

在权限存取的两个过程中,系统会用到 “mysql” 数据库(安装 MySQL 时被创建,数据库名称叫“mysql”) 中 user、host 和 db 这3个最重要的权限表。

在这 3 个表中,最重要的表示 user 表,其次是 db 表,host 表在大多数情况下并不使用。

user 中的列主要分为 4 个部分:用户列、权限列、安全列和资源控制列。

通常用的最多的是用户列和权限列,其中权限列又分为普通权限和管理权限。普通权限用于数据库的操作,比如 select_priv、super_priv 等。

当用户进行连接时,权限表的存取过程有以下两个过程:

先从 user 表中的 host、user 和 password 这 3 个字段中判断连接的 IP、用户名、和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。
如果通过身份验证、则按照以下权限表的顺序得到数据库权限:user -> db -> tables_priv -> columns_priv。
在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限。上面的第一阶段好理解,下面以一个例子来详细解释一下第二阶段。
为了方便测试,需要修改变量 sql_mode,不然会报错,如下

  1. MySQL [(none)]> grant select on *.* to xxx@localhost;
  2. ERROR 1133 (42000): Can't find any matching row in the user table
  3. MySQL [(none)]> SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
  4. Query OK, 0 rows affected, 2 warnings (0.07 sec)
  5. MySQL [(none)]> grant select on *.* to xxx@localhost;
  6. Query OK, 0 rows affected, 2 warnings (0.10 sec)
  1. // sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
  2. SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
1. 创建用户

xxx@localhost,并赋予所有数据库上的所有表的 select 权限

先查看user表显示的权限状态
  1. MySQL [mysql]> select * from user where user="xxx" and host='localhost' \G;
  2. *************************** 1. row ***************************
  3. Host: localhost
  4. User: xxx
  5. Select_priv: Y
  6. Insert_priv: N
  7. Update_priv: N
  8. Delete_priv: N
  9. Create_priv: N
  10. Drop_priv: N
  11. Reload_priv: N
  12. Shutdown_priv: N
  13. Process_priv: N
  14. File_priv: N
  15. Grant_priv: N
  16. References_priv: N
  17. Index_priv: N
  18. Alter_priv: N
  19. Show_db_priv: N
  20. Super_priv: N
  21. Create_tmp_table_priv: N
  22. Lock_tables_priv: N
  23. Execute_priv: N
  24. Repl_slave_priv: N
  25. Repl_client_priv: N
  26. Create_view_priv: N
  27. Show_view_priv: N
  28. Create_routine_priv: N
  29. Alter_routine_priv: N
  30. Create_user_priv: N
  31. Event_priv: N
  32. Trigger_priv: N
  33. Create_tablespace_priv: N
  34. ssl_type:
  35. ssl_cipher:
  36. x509_issuer:
  37. x509_subject:
  38. max_questions: 0
  39. max_updates: 0
  40. max_connections: 0
  41. max_user_connections: 0
  42. plugin: mysql_native_password
  43. authentication_string:
  44. password_expired: N
  45. password_last_changed: 2018-12-03 17:34:49
  46. password_lifetime: NULL
  47. account_locked: N
再查看db表的权限状态
  1. MySQL [mysql]> select * from db where user="xxx" and host='localhost' \G;
  2. Empty set (0.03 sec)

可以发现user表中Select_priv: Y,其他均为N

DB表中则无记录

也就是说,对所有数据库都具有相同的权限的用户并不需要记录到 db 表,而仅仅需要将 user 表中的 select_priv 改为 “Y” 即可。换句话说,user 表中的每个权限都代表了对所有数据库都有权限

2. 将 xxx@localhost 上的权限改为只对 db1 数据库上所有表的 select 权限。
  1. MySQL [mysql]> create database db1;
  2. Query OK, 1 row affected (0.01 sec)
  3. MySQL [mysql]> re^C
  4. MySQL [mysql]> revoke select on *.* from xxx@localhost;
  5. Query OK, 0 rows affected, 1 warning (0.06 sec)
  6. MySQL [mysql]> grant select on db1.* to xxx@localhost;
  7. Query OK, 0 rows affected, 1 warning (0.09 sec)
  8. MySQL [mysql]> select * from user where user='xxx'\G;
  9. *************************** 1. row ***************************
  10. Host: localhost
  11. User: xxx
  12. Select_priv: N
  13. Insert_priv: N
  14. Update_priv: N
  15. Delete_priv: N
  16. Create_priv: N
  17. Drop_priv: N
  18. Reload_priv: N
  1. MySQL [mysql]> select * from db where user='xxx'\G;
  2. *************************** 1. row ***************************
  3. Host: localhost
  4. Db: db1
  5. User: xxx
  6. Select_priv: Y
  7. Insert_priv: N
  8. Update_priv: N
  9. Delete_priv: N
  10. Create_priv: N
  11. Drop_priv: N
  12. Grant_priv: N
  13. References_priv: N
  14. Index_priv: N
  15. Alter_priv: N
  16. Create_tmp_table_priv: N
  17. Lock_tables_priv: N
  18. Create_view_priv: N
  19. Show_view_priv: N
  20. Create_routine_priv: N
  21. Alter_routine_priv: N
  22. Execute_priv: N
  23. Event_priv: N
  24. Trigger_priv: N

这时候发现,user 表中的 select_priv 变为 “N” ,而 db 表中增加了 dbxxx 的一条记录。也就是说,当只授予部分数据库某些权限时,user 表中的相应权限列保持 “N”,而将具体的数据库权限写入 db 表。tablecolumn 的权限机制和 db 类似。

3. tables_priv记录表权限
  1. MySQL [db1]> create table t1(id int(10),name char(10));
  2. Query OK, 0 rows affected (0.83 sec)
  3. MySQL [db1]> grant select on db1.t1 to mmm@localhost;
  4. Query OK, 0 rows affected, 2 warnings (0.06 sec)
  5. MySQL [mysql]> select * from user where user='mmm'\G;
  6. *************************** 1. row ***************************
  7. Host: localhost
  8. User: mmm
  9. Select_priv: N
  10. Insert_priv: N
  11. Update_priv: N
  12. Delete_priv: N
  13. Create_priv: N
  14. Drop_priv: N
  15. Reload_priv: N
  16. ...
  17. MySQL [mysql]> select * from db where user='mmm'\G;
  18. Empty set (0.00 sec)
  19. MySQL [mysql]> select * from tables_priv where user='mmm'\G;
  20. *************************** 1. row ***************************
  21. Host: localhost
  22. Db: db1
  23. User: mmm
  24. Table_name: t1
  25. Grantor: root@localhost
  26. Timestamp: 0000-00-00 00:00:00
  27. Table_priv: Select
  28. Column_priv:
  29. 1 row in set (0.00 sec)
  30. ERROR:
  31. No query specified
  32. MySQL [mysql]> select * from columns_priv where user='mmm'\G;
  33. Empty set (0.00 sec)

可以看见tables_priv表中增加了一条记录,而在user db columns_priv三个表中没有记录

从上例可以看出,当用户通过权限认证,进行权限分配时,将按照 ==user -> db -> tables_priv -> columns_priv== 的顺序进行权限分配,即先检查全局权限表 user,如果 user 中对应 权限为 “Y”,则此用户对所有数据库的权限都为“Y”,将不再检查 dbtables_privcolumns_priv;如果为“N”,则到 db 表中检查此用户对应的具体数据库,并得到 db 中为 “Y”的权限;如果 db 中相应权限为 “N”,则再依次检查tables_privcolumns_priv 中的权限,如果所有的都为“N”,则判断为不具备权限。

二. 账户管理

授权 grant

grant不仅可以用来授权,还可以用来创建用户。

授权的语法:

  1. grant 权限列表 on 库名.表名 to 用户@主机 identified by '密码';
创建用户 p1 ,权限为可以在所有数据库上执行所有权限,只能从本地进行连接
  1. MySQL [mysql]> grant all privileges on *.* to p1@localhost;
  2. Query OK, 0 rows affected, 2 warnings (0.03 sec)
  3. MySQL [mysql]> select * from user where user='p1'\G
  4. *************************** 1. row ***************************
  5. Host: localhost
  6. User: p1
  7. Select_priv: Y
  8. Insert_priv: Y
  9. Update_priv: Y
  10. Delete_priv: Y
  11. Create_priv: Y
  12. Drop_priv: Y
  13. Reload_priv: Y
  14. Shutdown_priv: Y
  15. Process_priv: Y
  16. File_priv: Y
  17. Grant_priv: N
  18. References_priv: Y
  19. Index_priv: Y
  20. Alter_priv: Y
  21. Show_db_priv: Y
  22. Super_priv: Y
  23. Create_tmp_table_priv: Y
  24. Lock_tables_priv: Y
  25. Execute_priv: Y
  26. Repl_slave_priv: Y
  27. Repl_client_priv: Y
  28. Create_view_priv: Y
  29. Show_view_priv: Y
  30. Create_routine_priv: Y
  31. Alter_routine_priv: Y
  32. Create_user_priv: Y
  33. Event_priv: Y
  34. Trigger_priv: Y
  35. Create_tablespace_priv: Y
  36. ssl_type:
  37. ssl_cipher:
  38. x509_issuer:
  39. x509_subject:
  40. max_questions: 0
  41. max_updates: 0
  42. max_connections: 0
  43. max_user_connections: 0
  44. plugin: mysql_native_password
  45. authentication_string:
  46. password_expired: N
  47. password_last_changed: 2018-12-03 18:11:01
  48. password_lifetime: NULL
  49. account_locked: N
  50. 1 row in set (0.00 sec)

除了 grant_priv 权限外,所有权限在user 表里面都是 “Y”。

增加对 p1 的 grant 权限
  1. MySQL [mysql]> grant all privileges on *.* to p1@localhost with grant option;
  2. Query OK, 0 rows affected, 1 warning (0.03 sec)
  3. MySQL [mysql]> select * from user where user='p1'\G
  4. *************************** 1. row ***************************
  5. Host: localhost
  6. User: p1
  7. Select_priv: Y
  8. Insert_priv: Y
  9. Update_priv: Y
  10. Delete_priv: Y
  11. Create_priv: Y
  12. Drop_priv: Y
  13. Reload_priv: Y
  14. Shutdown_priv: Y
  15. Process_priv: Y
  16. File_priv: Y
  17. Grant_priv: Y
  18. References_priv: Y
  19. Index_priv: Y
  20. Alter_priv: Y
  21. Show_db_priv: Y
  22. Super_priv: Y
  23. Create_tmp_table_priv: Y
  24. Lock_tables_priv: Y
  25. Execute_priv: Y
  26. Repl_slave_priv: Y
  27. Repl_client_priv: Y
  28. Create_view_priv: Y
  29. Show_view_priv: Y
  30. Create_routine_priv: Y
  31. Alter_routine_priv: Y
  32. Create_user_priv: Y
  33. Event_priv: Y
  34. Trigger_priv: Y
  35. Create_tablespace_priv: Y
  36. ssl_type:
  37. ssl_cipher:
  38. x509_issuer:
  39. x509_subject:
  40. max_questions: 0
  41. max_updates: 0
  42. max_connections: 0
  43. max_user_connections: 0
  44. plugin: mysql_native_password
  45. authentication_string:
  46. password_expired: N
  47. password_last_changed: 2018-12-03 18:11:01
  48. password_lifetime: NULL
  49. account_locked: N
  50. 1 row in set (0.00 sec)
设置密码赋予grant权限
  1. MySQL [mysql]> grant all privileges on *.* to p1@localhost identified by '123' with grant option;
  2. Query OK, 0 rows affected, 2 warnings (0.01 sec)
  3. MySQL [mysql]> select * from user where user='p1'\G
  4. *************************** 1. row ***************************
  5. Host: localhost
  6. User: p1
  7. Select_priv: Y
  8. Insert_priv: Y
  9. Update_priv: Y
  10. Delete_priv: Y
  11. Create_priv: Y
  12. Drop_priv: Y
  13. Reload_priv: Y
  14. Shutdown_priv: Y
  15. Process_priv: Y
  16. File_priv: Y
  17. Grant_priv: Y
  18. References_priv: Y
  19. Index_priv: Y
  20. Alter_priv: Y
  21. Show_db_priv: Y
  22. Super_priv: Y
  23. Create_tmp_table_priv: Y
  24. Lock_tables_priv: Y
  25. Execute_priv: Y
  26. Repl_slave_priv: Y
  27. Repl_client_priv: Y
  28. Create_view_priv: Y
  29. Show_view_priv: Y
  30. Create_routine_priv: Y
  31. Alter_routine_priv: Y
  32. Create_user_priv: Y
  33. Event_priv: Y
  34. Trigger_priv: Y
  35. Create_tablespace_priv: Y
  36. ssl_type:
  37. ssl_cipher:
  38. x509_issuer:
  39. x509_subject:
  40. max_questions: 0
  41. max_updates: 0
  42. max_connections: 0
  43. max_user_connections: 0
  44. plugin: mysql_native_password
  45. authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
  46. password_expired: N
  47. password_last_changed: 2018-12-03 18:14:40
  48. password_lifetime: NULL
  49. account_locked: N
  50. 1 row in set (0.00 sec)

在5.7版本后的数据库,密码字段改为authentication_string

创建新用户 p2,可以从任何 IP 连接,权限为对 db1 数据库里的所有表进行 select 、update、insert 和 delete 操作,初始密码为“123”
  1. MySQL [mysql]> grant select,insert,update,delete on db1.* to 'p2'@'%' identified by '123';
  2. Query OK, 0 rows affected, 1 warning (0.01 sec)
  3. MySQL [mysql]> select * from user where user='p2'\G;
  4. *************************** 1. row ***************************
  5. Host: %
  6. User: p2
  7. Select_priv: N
  8. Insert_priv: N
  9. Update_priv: N
  10. Delete_priv: N
  11. Create_priv: N
  12. Drop_priv: N
  13. Reload_priv: N
  14. Shutdown_priv: N
  15. ...
  16. Create_tablespace_priv: N
  17. ssl_type:
  18. ssl_cipher:
  19. x509_issuer:
  20. x509_subject:
  21. max_questions: 0
  22. max_updates: 0
  23. max_connections: 0
  24. max_user_connections: 0
  25. plugin: mysql_native_password
  26. authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
  27. password_expired: N
  28. password_last_changed: 2018-12-03 18:20:44
  29. password_lifetime: NULL
  30. account_locked: N
  31. 1 row in set (0.00 sec)
  32. ERROR:
  33. No query specified
  34. MySQL [mysql]> select * from db where user='p2'\G;
  35. *************************** 1. row ***************************
  36. Host: %
  37. Db: db1
  38. User: p2
  39. Select_priv: Y
  40. Insert_priv: Y
  41. Update_priv: Y
  42. Delete_priv: Y
  43. Create_priv: N
  44. Drop_priv: N
  45. Grant_priv: N
  46. References_priv: N
  47. Index_priv: N
  48. Alter_priv: N
  49. Create_tmp_table_priv: N
  50. Lock_tables_priv: N
  51. Create_view_priv: N
  52. Show_view_priv: N
  53. Create_routine_priv: N
  54. Alter_routine_priv: N
  55. Execute_priv: N
  56. Event_priv: N
  57. Trigger_priv: N
  58. 1 row in set (0.00 sec)

user 表中的权限都是“N”,db 表中增加的记录权限则都是“Y”,这样只授予用户适当的权限,而不会授予过多的权限。

本例中的 IP 限制为所有 IP 都可以连接,因此设置为 “%”,mysql 数据库中是通过 user 表的 host 字段来进行控制,host 可以是以下类型的赋值。

注意: mysql 数据库的 user 表中 host 的值为 “%” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。

授予 super、process、file 权限给用户 p3@%
  1. MySQL [mysql]> grant super,process,file on db1.* to 'p3'@'%';
  2. ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
  3. MySQL [mysql]> grant super,process,file on *.* to 'p3'@'%';
  4. Query OK, 0 rows affected (0.03 sec)

这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 *.*,否则会提示错误,如上

那这几个权限是干啥的?
process通过这个权限,用户可以执行SHOW PROCESSLISTKILL命令。默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。

拥有file权限才可以执行 select ..into outfileload data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。

super这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS

另外一个比较特殊的

usage权限
连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。

该权限只能用于数据库登陆,不能执行任何操作;且usage权限不能被回收,也即``REVOKE用户并不能删除用户。

查看账号权限

账号创建好后,可以通过如下命令查看权限:

  1. show grants for user@host;
  1. MySQL [mysql]> show grants for p2@'%';
  2. +-------------------------------------------------------------+
  3. | Grants for p2@% |
  4. +-------------------------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'p2'@'%' |
  6. | GRANT SELECT, INSERT, UPDATE, DELETE ON `db1`.* TO 'p2'@'%' |
  7. +-------------------------------------------------------------+
  8. 2 rows in set (0.00 sec)

更改账户权限

创建用户账号p4,权限为对db1所有表具有select权限
  1. MySQL [mysql]> grant select on db1.* to p4@'%';
  2. Query OK, 0 rows affected, 1 warning (0.01 sec)
  3. MySQL [mysql]> show grants for p4@'%';
  4. +-------------------------------------+
  5. | Grants for p4@% |
  6. +-------------------------------------+
  7. | GRANT USAGE ON *.* TO 'p4'@'%' |
  8. | GRANT SELECT ON `db1`.* TO 'p4'@'%' |
  9. +-------------------------------------+
  10. 2 rows in set (0.00 sec)
增加delete权限
  1. MySQL [mysql]> grant delete on db1.* to p4@'%';
  2. Query OK, 0 rows affected (0.01 sec)
  3. MySQL [mysql]> show grants for p4@'%';
  4. +---------------------------------------------+
  5. | Grants for p4@% |
  6. +---------------------------------------------+
  7. | GRANT USAGE ON *.* TO 'p4'@'%' |
  8. | GRANT SELECT, DELETE ON `db1`.* TO 'p4'@'%' |
  9. +---------------------------------------------+
  10. 2 rows in set (0.00 sec)

和已有的 select 权限进行合并

删除delete权限

revoke 语句可以回收已经赋予的权限

  1. MySQL [mysql]> show grants for p4@'%';
  2. +---------------------------------------------+
  3. | Grants for p4@% |
  4. +---------------------------------------------+
  5. | GRANT USAGE ON *.* TO 'p4'@'%' |
  6. | GRANT SELECT, DELETE ON `db1`.* TO 'p4'@'%' |
  7. +---------------------------------------------+
  8. 2 rows in set (0.00 sec)
  9. MySQL [mysql]> revoke delete on db1.* from p4@'%';
  10. Query OK, 0 rows affected (0.01 sec)
  11. MySQL [mysql]> show grants for p4@'%';
  12. +-------------------------------------+
  13. | Grants for p4@% |
  14. +-------------------------------------+
  15. | GRANT USAGE ON *.* TO 'p4'@'%' |
  16. | GRANT SELECT ON `db1`.* TO 'p4'@'%' |
  17. +-------------------------------------+
  18. 2 rows in set (0.00 sec)

usagerevoke?

  1. MySQL [mysql]> revoke select on db1.* from p4@'%';
  2. Query OK, 0 rows affected (0.02 sec)
  3. MySQL [mysql]> show grants for p4@'%';
  4. +--------------------------------+
  5. | Grants for p4@% |
  6. +--------------------------------+
  7. | GRANT USAGE ON *.* TO 'p4'@'%' |
  8. +--------------------------------+
  9. 1 row in set (0.00 sec)
  10. MySQL [mysql]> revoke usage on db1.* from p4@'%';
  11. ERROR 1141 (42000): There is no such grant defined for user 'p4' on host '%'

usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。

要彻底的删除账号,可以使用 drop user

  1. drop user p4@'%';

账号资源限制

创建 MySQL 账号时,还有一类选项称为账号资源限制,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:

  1. max_queries_per_hour count : 单个账号每小时执行的查询次数
  2. max_upodates_per_hour count : 单个账号每小时执行的更新次数
  3. max_connections_per_hour count : 单个账号每小时连接服务器的次数
  4. max_user_connections count : 单个账号并发连接服务器的次数

注意:
添加用户或者权限,使用mysql> flush privileges; 刷新权限

具体权限可以参考官网文档

https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html

MySQL用户账户管理/权限管理/资源限制的更多相关文章

  1. MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数

    用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIE ...

  2. (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理

    用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...

  3. Linux_用户管理&权限管理

    2017年1月11日, 星期三 Linux_用户管理&权限管理 1.  Linux用户管理&权限管理 终端的概念: tty  查看登录的终端 类型  user group    oth ...

  4. 实验楼学习linux第一章第三节用户及文件权限管理

    用户及文件权限管理 常用命令 查看用户 whoami 创建用户 sudo adduser 用户名 切换账户 su 用户名 删除账户 sudo deluser 用户名 --remove-home 查看用 ...

  5. solaris用户与文件权限管理

    此文章已于 20:45:28 2015/3/22 重新发布到 zhuxuekui3 solaris用户与文件权限管理1 类别    「网站分类」Oracle 一.用户与用户组管理 三种用户:超级用户. ...

  6. Ubuntu 用户管理/权限管理

    Ubuntu 用户管理/权限管理 小小记录一下 Ubuntu 下用户/权限管理常用的一些命令 用户管理 组管理 文件权限 给用户添加 sudo 权限 给用户添加 sudo 权限 首先先给出几个文件 / ...

  7. Linux用户及文件权限管理

    Linux用户及文件权限管理

  8. WordPress用户角色及其权限管理编辑插件:User Role Editor汉化版

    如果Wordpress默认的用户角色及权限不能满足您的需求,又觉得修改代码编辑用户权限太麻烦.那不妨试试User Role Editor,Wordpress用户角色及其权限管理编辑插件. User R ...

  9. NopCommerce源代码分析之用户验证和权限管理

    目录 1.  介绍 2.  UML 2.1  实体类UML图 2.2  业务相关UML图 3.  核心代码分析 3.1  实体类源代码 3.2  业务相关源代码 3.3  相关控制器源代码 3.4  ...

随机推荐

  1. Exchange2016 & Skype for business 集成之一配置合作伙伴应用程序

    准备条件 为Skype for Business Server和Exchange Server之间建立服务器到服务器的身份验证,您必须做两件事:1)您必须为每台服务器分配合适的证书(详细参考文档htt ...

  2. August 14th 2017 Week 33rd Monday

    Life is like a watch, you can return to the starting point, they are not yesterday! 人生就像钟表,可以回到起点,却已 ...

  3. S/4HANA生产订单增强WORKORDER_UPDATE方法BEFORE_UPDATE参数分析

    题目这个增强的输入参数很恐怖,长长的一串: CALL BADI l_badi->BEFORE_UPDATE EXPORTING IT_PIINSTRUCTIONVALUE = IT_PIINST ...

  4. P1395 会议

    题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地 ...

  5. 简单属性margin和padding

    关于margin属性的介绍 margin:20px 上 右 下 左 都是20px margin:20px 40 px 上 下 20px 左 右 40px margin:20px 40px  60px ...

  6. 折腾一下WebSocket的ArrayBuffer传输方式

    前言   之前写WebSocket都是基于文本传输的,后来准备升级项目,于是打算尝试一下arraybuffer传输方式,由于是第一次使用javascript处理字符串转arraybuffer,不过真的 ...

  7. curl http code 0

    使用curl进行post请求后,接收status code ,结果返回的结果是0 ,但是请求返回的数据是正常的. 检查后发现是执行顺序问题: $response = [ 'statusCode' =& ...

  8. Spring中使用属性文件properties的两种方式

    实际项目中,通常将可配置的参数放到属性文件中,例如数据库连接信息.redis连接信息等,便于统一管理.然后通过IoC框架spring将其加载到上下文中,使得程序可以直接使用. 创建mysql.prop ...

  9. Oracle 体系结构五

    确定实例是否是RAC数据库的一部分:select parallel from v$instance; 确定数据库是否通过Data Guard备用数据库的保护来防止数据丢失:select protect ...

  10. 点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )

    测试移动端页面的时候,偶然发现点击底部input输入框时,弹出的虚拟键盘偶尔会挡住input输入框. 输入框固定在页面底部,如图所示:   input固定底部设计图.png 点击底部input输入框唤 ...