熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MySQL 存取權限系統

2013-11-23 20:59:05  來源: MySQL 

   MySQL 用戶名和口令
  * MySQL使用於認證目的的用戶名與Unix用戶名(登錄名字)或Windows用戶名無關缺省地大多數MySQL客戶嘗試使用當前Unix用戶名作為MySQL用戶名登錄但是這僅僅為了方便客戶程序允許用u或user選項指定一個不同的名字及與安全的考慮所有的MySQL用戶名都應該有口令
  * MySQL用戶名最長可以是各字符典型地Unix用戶名限制為個字符
  * MySQL口令與Unix口令沒關系
  * MySQL加密口令使用了一個Unix登錄期間所用的不同算法PASSWORD()和ENCRYPT()
  函數PASSWORD(str)
  從純文本口令str計算一個口令字符串該函數被用於為了在user授權表的Password列中存儲口令而加密MySQL口令
  mysql> select PASSWORD(badpwd);
  > fddb
  PASSWORD()加密是非可逆的PASSWORD()不以與Unix口令加密的相同的方法執行口令加密你不應該假定如果你的Unix 口令和你的MySQL口令是一樣的PASSWORD()將導致與在Unix口令文件存儲的相同的加密值見ENCRYPT()
  ENCRYPT(str[salt])
  使用Unix crypt()系統調用加密strsalt參數應該是一個有個字符的字符串(MySQL salt可以長於個字符
  mysql> select ENCRYPT(hello);
  > VxuFAJXVARROc
  如果crypt()在你的系統上不可用ENCRYPT()總是返回NULLENCRYPT()只保留str起始個字符而忽略所有其他至少在某些系統上是這樣這將由底層的crypt()系統調用的行為決定
   與MySQL服務器連接
  語法格式
  shell> mysql [h host_name][u user_name][pyour_pass ]
  h u和p選項的另一種形式是host=host_nameuser=user_name和password=your_pass
  注意p或password=與跟隨它後面的口令之間沒有空格(在命令行上指定一個口令是不安全的!)
  對於命令行沒有的聯接參數mysql使用缺省值
  * 缺省主機名是localhost
  * 缺省用戶名是你的Unix登錄名
  * 如果沒有p則沒有提供口令
  缺省值參數的指定
  在你的主目錄下f的配置文件的[client]小節裡指定連接參數
  [client]
  host=host_name
  user=user_name
  password=your_pass
  注命令行上被指定的值優先於在配置文件和環境變量中指定的值
  最安全的方法是讓客戶程序提示口令或在一個適當保護的f文件中指定口令
   MySQL提供的權限
  權限   列   上下文
  select Select_priv 表
  insert Insert_priv 表
  update Update_priv 表
  delete Delete_priv 表
  index Index_priv 表
  alter Alter_priv 表
  create Create_priv 數據庫表或索引
  drop Drop_priv 數據庫或表
  grant Grant_priv 數據庫或表
  references References_priv 數據庫或表
  reload Reload_priv 服務器管理
  shutdown Shutdown_priv 服務器管理
  process Process_priv 服務器管理
  file File_priv 在服務器上的文件存取
  注grant權限允許你把你自己擁有的那些權限授給其他的用戶
  file權限給予你用LOAD DATA INFILE和SELECT INTO OUTFILE語句讀和寫服務器上的文件任何被授予這個權限的用戶都能讀或寫MySQL服務器能讀或寫的任何文件
   存取控制連接證實
  身份檢查使用user表個(Host User和Password)范圍字段服務器只有在一個user表條目匹配你的主機名和用戶名並且你提供了正確的口令時才接受連接
  注一個Host值可以是主機名或一個IP數字localhost指出本地主機 可以在Host字段裡使用通配符字符%_ Host值%匹配任何主機名當一個連接被嘗試時服務器浏覽排序的條目並使用找到的第一個匹配
  普遍的誤解是認為對一個給定的用戶名當服務器試圖對連接尋找匹配時明確命名那個用戶的所有條目將首先被使用這明顯不是事實
   存取控制請求證實
  一旦你建立了一個連接服務器進入階段對在此連接上進來的每個請求服務器檢查你是否有足夠的權限來執行它授權表用GRANT和REVOKE命令操作
  GRANT priv_type [(column_list)] [ priv_type [(column_list)] ]
  ON {tbl_name | * | ** | db_name*}
  TO user_name [IDENTIFIED BY password]
  [ user_name [IDENTIFIED BY password] ]
  [WITH GRANT OPTION]
  REVOKE priv_type [(column_list)] [ priv_type [(column_list)] ]
  ON {tbl_name | * | ** | db_name*}
  FROM user_name [ user_name ]
  GRANT在MySQL 或以後版本中實現對於更早MySQL版本GRANT語句不做任何事情
  GRANT和REVOKE命令允許系統主管在個權限級別上授權和撤回賦予MySQL用戶的權利
  全局級別
  全局權限作用於一個給定服務器上的所有數據庫這些權限存儲在mysqluser表中
  數據庫級別
  數據庫權限作用於一個給定數據庫的所有表這些權限存儲在mysqldb和mysqlhost表中
  表級別
  表權限作用於一個給定表的所有列這些權限存儲在mysqltables_priv表中
  列級別
  列權限作用於在一個給定表的單個列這些權限存儲在lumns_priv表中
  user表權限是超級用戶權限只把user表的權限授予超級用戶如服務器或數據庫主管是明智的對其他用戶你應該把在user表中的權限設成N並且僅在一個特定數據庫的基礎上授權 使用db和host表
   權限更改何時生效
  當mysqld啟動時所有的授權表內容被讀進存儲器並且從那點生效
  用GRANTREVOKE或SET PASSWORD對授權表施行的修改會立即被服務器注意到
  如果你手工地修改授權表(使用INSERTUPDATE等等)你應該執行一個FLUSH PRIVILEGES語句或運行mysqladmin flushprivileges告訴服務器再裝載授權表否則你的改變將不生效除非你重啟服務器
   建立初始的MySQL權限
  在安裝MySQL後你通過運行scripts/mysql_install_db安裝初始的存取權限包含下列權限集合
  * MySQL root用戶作為可做任何事情的一個超級用戶連接必須由本地主機發出注意出世的root口令是空的因此任何人能以root而沒有一個口令進行連接並且被授予所有權限
  * 一個匿名用戶他可對有一個test或以test_開始的名字的數據庫做任何時期事情連接必須由本地主機發出這意味著任何本地用戶能連接並且視為匿名用戶
  * 其他權限被拒絕例如一般用戶不能使用mysqladmin shutdown或mysqladmin processlist
  為MySQL root用戶指定一個口令(注意你使用PASSWORD()函數指定口令)
  shell> mysql u root mysql
  mysql> UPDATE user SET Password=PASSWORD(new_password)
  WHERE user=root;
  mysql> FLUSH PRIVILEGES;
  在MySQL 和以上版本中你可以使用SET PASSWORD語句
  shell> mysql u root mysql
  mysql> SET PASSWORD FOR root=PASSWORD(new_password);
  設置口令的另一種方法是使用mysqladmin命令
  shell> mysqladmin u root password new_password
  看看scripts/mysql_install_db腳本看它如何安裝缺省的權限你可用它作為一個研究如何增加其他用戶的基礎
  為了完全重建權限表刪除在包含mysql數據庫的目錄下所有*frm*MYI*MYD文件(這是在數據庫目錄下面命名為mysql的目錄當你運行mysqld help時它被列出)然後運行mysql_install_db腳本可能在首先編輯它擁有你想要的權限之後
   向MySQL增加新用戶權限
  增加用戶個不同的方法
  通過使用GRANT語句或通過直接操作MySQL授權表
  比較好的方法是使用GRANT語句因為他們是更簡明並且好像錯誤少些
  shell> mysql user=root mysql
  mysql> GRANT ALL PRIVILEGES ON ** TO monty@localhost
  IDENTIFIED BY something WITH GRANT OPTION;
  mysql> GRANT ALL PRIVILEGES ON ** TO monty@%
  IDENTIFIED BY something WITH GRANT OPTION;
  mysql> GRANT RELOADPROCESS ON ** TO admin@localhost;
  mysql> GRANT USAGE ON ** TO dummy@localhost;
  monty
  可以從任何地方連接服務器的一個完全的超級用戶但是必須使用一個口令(something做這個注意我們必須對monty@localhost和monty@%發出GRANT語句如果我們增加localhost條目對localhost的匿名用戶條目在我們從本地主機連接接時由mysql_install_db創建的條目將優先考慮因為它有更特定的Host字段值所以以user表排列順序看更早到來
  admin
  可以從localhost沒有一個口令進行連接並且被授予reload和process管理權限的用戶這允許用戶執行mysqladmin reloadmysqladmin refresh和mysqladmin flush*命令還有mysqladmin processlist沒有授予數據庫有關的權限他們能在以後通過發出另一個GRANT語句授權
  dummy
  可以不用一個口令連接的一個用戶但是只能從本地主機全局權限被設置為NUSAGE權限類型允許你無需權限就可設置一個用戶它假定你將在以後授予數據庫相關的權限
  也可以直接通過發出INSERT語句增加同樣的用戶存取信息然後告訴服務器再次裝入授權表
  shell> mysql user=root mysql
  mysql> INSERT INTO user VALUES(localhostmontyPASSWORD(something)
  YYY
From:http://tw.wingwit.com/Article/program/MySQL/201311/29392.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.