CINXE.COM

plugin:authmysql [DokuWiki]

<!DOCTYPE html> <html lang="en" dir="ltr" class="no-js"> <head> <meta charset="utf-8" /> <title>plugin:authmysql [DokuWiki]</title> <meta name="generator" content="DokuWiki"/> <meta name="theme-color" content="#008800"/> <meta name="robots" content="index,follow"/> <meta name="keywords" content="plugin,authmysql"/> <link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="DokuWiki"/> <link rel="start" href="/"/> <link rel="contents" href="/plugin:authmysql?do=index" title="Sitemap"/> <link rel="manifest" href="/lib/exe/manifest.php"/> <link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed.php"/> <link rel="alternate" type="application/rss+xml" title="Current namespace" href="/feed.php?mode=list&amp;ns=plugin"/> <link rel="edit" title="Edit this page" href="/plugin:authmysql?do=edit"/> <link rel="alternate" type="text/html" title="Plain HTML" href="/_export/xhtml/plugin:authmysql"/> <link rel="alternate" type="text/plain" title="Wiki Markup" href="/_export/raw/plugin:authmysql"/> <link rel="canonical" href="https://www.dokuwiki.org/plugin:authmysql"/> <link rel="stylesheet" href="/lib/exe/css.php?t=dokuwiki&amp;tseed=f1005bad3d81fc9c803c7f93d32a390e"/> <script >var NS='plugin';var JSINFO = {"plugins":{"edittable":{"default columnwidth":""}},"id":"plugin:authmysql","namespace":"plugin","ACT":"show","useHeadingNavigation":0,"useHeadingContent":0};(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js" defer="defer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js" defer="defer"></script> <script src="/lib/exe/js.php?t=dokuwiki&amp;tseed=f1005bad3d81fc9c803c7f93d32a390e&amp;lang=en" defer="defer"></script> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link rel="shortcut icon" href="/lib/tpl/dokuwiki/images/favicon.ico" /> <link rel="apple-touch-icon" href="/lib/tpl/dokuwiki/images/apple-touch-icon.png" /> <meta name="verify-v1" content="OVxl3gsCv2MhZqh1cBQyl0JytWXSwXMjyvwc+4w3WtA=" /> <meta name="google-site-verification" content="YhTVK69hW94ZXUtc2zSLPxTkZKbZIn0zK67mz5WQB-E" /> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-83791-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-83791-1', { 'anonymize_ip': true }); </script> </head> <body> <div id="dokuwiki__site"><div id="dokuwiki__top" class="site dokuwiki mode_show tpl_dokuwiki showSidebar hasSidebar"> <!-- ********** HEADER ********** --> <header id="dokuwiki__header"><div class="pad group"> <div class="headings group"> <ul class="a11y skip"> <li><a href="#dokuwiki__content">skip to content</a></li> </ul> <h1 class="logo"><a href="/start" accesskey="h" title="Home [h]"><img src="/lib/tpl/dokuwiki/images/logo.png" width="64" height="64" alt="" /><span>DokuWiki</span></a></h1> <p class="claim">It's better when it's simple</p> </div> <div class="tools group"> <!-- USER TOOLS --> <div id="dokuwiki__usertools"> <h3 class="a11y">User Tools</h3> <ul> <li class="action login"><a href="/plugin:authmysql?do=login&amp;sectok=" title="Log In" rel="nofollow"><span>Log In</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg></a></li> </ul> </div> <!-- SITE TOOLS --> <div id="dokuwiki__sitetools"> <h3 class="a11y">Site Tools</h3> <form action="/start" method="get" role="search" class="search doku_form" id="dw__search" accept-charset="utf-8"><input type="hidden" name="do" value="search" /><input type="hidden" name="id" value="plugin:authmysql" /><div class="no"><input name="q" type="text" class="edit" title="[F]" accesskey="f" placeholder="Search" autocomplete="on" id="qsearch__in" value="" /><button value="1" type="submit" title="Search">Search</button><div id="qsearch__out" class="ajax_qsearch JSpopup"></div></div></form> <div class="mobileTools"> <form action="/doku.php" method="get" accept-charset="utf-8"><div class="no"><input type="hidden" name="id" value="plugin:authmysql" /><select name="do" class="edit quickselect" title="Tools"><option value="">Tools</option><optgroup label="Page Tools"><option value="edit">Edit this page</option><option value="revisions">Old revisions</option><option value="backlink">Backlinks</option></optgroup><optgroup label="Site Tools"><option value="recent">Recent Changes</option><option value="media">Media Manager</option><option value="index">Sitemap</option></optgroup><optgroup label="User Tools"><option value="login">Log In</option></optgroup></select><button type="submit">&gt;</button></div></form> </div> <ul> <li class="action recent"><a href="/plugin:authmysql?do=recent" title="Recent Changes [r]" rel="nofollow" accesskey="r">Recent Changes</a></li><li class="action media"><a href="/plugin:authmysql?do=media&amp;ns=plugin" title="Media Manager" rel="nofollow">Media Manager</a></li><li class="action index"><a href="/plugin:authmysql?do=index" title="Sitemap [x]" rel="nofollow" accesskey="x">Sitemap</a></li> </ul> </div> </div> <!-- BREADCRUMBS --> <div class="breadcrumbs"> <div class="trace"><span class="bchead">Trace:</span> <span class="bcsep">•</span> <span class="curid"><bdi><a href="/plugin:authmysql" class="breadcrumbs" title="plugin:authmysql">authmysql</a></bdi></span></div> </div> <hr class="a11y" /> </div></header><!-- /header --> <div class="wrapper group"> <!-- ********** ASIDE ********** --> <nav id="dokuwiki__aside" aria-label="Sidebar"><div class="pad aside include group"> <h3 class="toggle">Sidebar</h3> <div class="content"><div class="group"> <p> <strong>Learn about DokuWiki</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/features" class="wikilink1" title="features" data-wiki-id="features">Features</a> &amp; <a href="/blogroll" class="wikilink1" title="blogroll" data-wiki-id="blogroll">reviews</a> </div> </li> <li class="level1"><div class="li"> <a href="/install" class="wikilink1" title="install" data-wiki-id="install">Installation guide</a></div> </li> <li class="level1"><div class="li"> <a href="/manual" class="wikilink1" title="manual" data-wiki-id="manual">User manual</a> &amp; <a href="/wiki:syntax" class="wikilink1" title="wiki:syntax" data-wiki-id="wiki:syntax">syntax</a></div> </li> <li class="level1"><div class="li"> <a href="/changes" class="wikilink1" title="changes" data-wiki-id="changes">Release notes</a></div> </li> <li class="level1"><div class="li"> <a href="/faq" class="wikilink1" title="faq" data-wiki-id="faq">FAQ</a></div> </li> </ul> <p> <strong>Advanced Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/extensions" class="wikilink1" title="extensions" data-wiki-id="extensions">Extensions</a></div> </li> <li class="level1"><div class="li"> <a href="/development" class="wikilink1" title="development" data-wiki-id="development">Development manual</a></div> </li> </ul> <p> <strong>Corporate Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/faq:support" class="wikilink1" title="faq:support" data-wiki-id="faq:support">Get support</a></div> </li> <li class="level1"><div class="li"> <a href="/donate" class="wikilink1" title="donate" data-wiki-id="donate">Donations</a></div> </li> </ul> <p> <strong>Our Community</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/teams:getting_involved" class="wikilink1" title="teams:getting_involved" data-wiki-id="teams:getting_involved">Get involved</a></div> </li> <li class="level1"><div class="li"> <a href="/dokuinstall" class="wikilink1" title="dokuinstall" data-wiki-id="dokuinstall">Users</a></div> </li> <li class="level1"><div class="li"> <a href="http://forum.dokuwiki.org" class="urlextern" title="http://forum.dokuwiki.org">User forum</a></div> </li> <li class="level1"><div class="li"> <a href="/mailinglist" class="wikilink1" title="mailinglist" data-wiki-id="mailinglist">Development mailinglist</a></div> </li> </ul> <hr /> <p> Follow us on <a href="https://phpc.social/@dokuwiki" class="urlextern" title="https://phpc.social/@dokuwiki">Mastodon</a> and other <a href="/social" class="wikilink1" title="social" data-wiki-id="social">social networks</a>. </p> <p> <a href="/privacy" class="wikilink1" title="privacy" data-wiki-id="privacy">Our Privacy Policy</a> </p> </div></div> </div></nav><!-- /aside --> <!-- ********** CONTENT ********** --> <main id="dokuwiki__content"><div class="pad group"> <div class="pageId"><span>plugin:authmysql</span></div> <div class="page group"> <!-- wikipage start --> <!-- TOC START --> <div id="dw__toc" class="dw__toc"> <h3 class="toggle">Table of Contents</h3> <div> <ul class="toc"> <li class="level1"><div class="li"><a href="#mysql_authentication_plugin">MySQL Authentication Plugin</a></div> <ul class="toc"> <li class="level2"><div class="li"><a href="#description">Description</a></div></li> <li class="level2"><div class="li"><a href="#usage">Usage</a></div></li> <li class="level2"><div class="li"><a href="#real_world_examples">Real World Examples</a></div></li> <li class="level2"><div class="li"><a href="#configuration">Configuration</a></div></li> <li class="level2"><div class="li"><a href="#how_to_configure_authmysql_plugin">How to configure authmysql plugin</a></div></li> <li class="level2"><div class="li"><a href="#how_to_enable_authmysql_authentication">How to enable authMySQL authentication</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#adding_the_superuser_to_the_new_mysql_tables">Adding the Superuser to the new MySQL Tables</a></div></li> <li class="level3"><div class="li"><a href="#configure_the_superuser_in_wiki">Configure the Superuser in wiki</a></div></li> <li class="level3"><div class="li"><a href="#enable_mysql_authentication">Enable MySQL Authentication</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#plugin_configuration_settings">Plugin Configuration settings</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#option_server">Option &#039;server&#039;</a></div></li> <li class="level3"><div class="li"><a href="#option_user">Option &#039;user&#039;</a></div></li> <li class="level3"><div class="li"><a href="#option_password">Option &#039;password&#039;</a></div></li> <li class="level3"><div class="li"><a href="#option_database">Option &#039;database&#039;</a></div></li> <li class="level3"><div class="li"><a href="#option_debug">Option &#039;debug&#039;</a></div></li> <li class="level3"><div class="li"><a href="#option_forwardclearpass">Option &#039;forwardClearPass&#039;</a></div></li> <li class="level3"><div class="li"><a href="#option_tablestolock">Option &#039;TablesToLock&#039;</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#sql_user_authentication">SQL User Authentication</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#checkpass">checkPass</a></div></li> <li class="level3"><div class="li"><a href="#getuserinfo">getUserInfo</a></div></li> <li class="level3"><div class="li"><a href="#getgroups">getGroups</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#sql_basic_user_manager_support">SQL Basic User Manager Support</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#getusers">getUsers</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#sql_support_for_add_user">SQL Support for Add User</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#adduser">addUser</a></div></li> <li class="level3"><div class="li"><a href="#addgroup">addGroup</a></div></li> <li class="level3"><div class="li"><a href="#addusergroup">addUserGroup</a></div></li> <li class="level3"><div class="li"><a href="#delgroup">delGroup</a></div></li> <li class="level3"><div class="li"><a href="#getuserid">getUserID</a></div></li> <li class="level3"><div class="li"><a href="#getgroupid">getGroupID</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#sql_support_for_delete_user">SQL Support for Delete User</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#deluser">delUser</a></div></li> <li class="level3"><div class="li"><a href="#deluserrefs">delUserRefs</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#sql_support_for_modify_user">SQL Support for Modify User</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#updateuser">updateUser</a></div></li> <li class="level3"><div class="li"><a href="#delusergroup">delUserGroup</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#summarized_plugin_configuration">Summarized plugin configuration</a></div></li> <li class="level2"><div class="li"><a href="#example_database">Example Database</a></div></li> <li class="level2"><div class="li"><a href="#store_first_and_last_name_separated">Store first and last name separated</a></div></li> <li class="level2"><div class="li"><a href="#issues">Issues</a></div></li> <li class="level2"><div class="li"><a href="#php_7_mysqli">PHP 7 &amp; MYSQLI</a></div></li> <li class="level2"><div class="li"><a href="#discussion">Discussion</a></div></li> </ul></li> </ul> </div> </div> <!-- TOC END --> <h1 class="sectionedit1" id="mysql_authentication_plugin">MySQL Authentication Plugin</h1> <div class="level1"> <div class="pluginrepo_entry"><div class="usageInfo"><div class="compatibility"><p class="label">Compatible with DokuWiki</p><p>(bundled up to version Greebo)</p></div></div><div class="mainInfo"><p class="description"><a class="media" href="/plugins"><img alt="plugin" class="medialeft" src="/lib/plugins/pluginrepo/images/dwplugin.png" width="60" height="60" /></a> This backend uses a MySQL Database to store user data and passwords.</p></div><div class="metaInfo"><dl><dt>Last updated on</dt><dd>2014-02-15</dd><dt>Provides</dt><dd><a href="/plugins?plugintype=128#extension__table" class="wikilink1" title="List all Auth plugins">Auth</a></dd><dt>Repository</dt><dd><a class="urlextern" href="https://github.com/dokuwiki/dokuwiki/tree/master/lib/plugins/authmysql">Source</a></dd></dl></div><div class="moreInfo"><p class="similar">Similar to <a href="/plugin:authpdo" class="wikilink1" title="plugin:authpdo" data-wiki-id="plugin:authpdo">authpdo</a>, <a href="/plugin:authsqlite" class="wikilink1" title="plugin:authsqlite" data-wiki-id="plugin:authsqlite">authsqlite</a></p><p class="tags">Tagged with <a href="/plugins?plugintag=%21discontinued#extension__table" class="wikilink1" title="List all plugins with this tag">!discontinued</a></p></div><div class="authorInfo"><strong>By <a href="mailto:andi%20%5Bat%5D%20splitbrain%20%5Bdot%5D%20org" class="mail" title="andi [at] splitbrain [dot] org">Andreas Gohr</a></strong><ul><li><a href="/plugin:badbehaviour" class="wikilink1" title="plugin:badbehaviour" data-wiki-id="plugin:badbehaviour">badbehaviour</a></li> <li><a href="/plugin:amazon" class="wikilink1" title="plugin:amazon" data-wiki-id="plugin:amazon">amazon</a></li> <li><a href="/plugin:xfortune" class="wikilink1" title="plugin:xfortune" data-wiki-id="plugin:xfortune">xfortune</a></li> <li><a href="/plugin:statistics" class="wikilink1" title="plugin:statistics" data-wiki-id="plugin:statistics">statistics</a></li> <li><a href="/plugin:translation" class="wikilink1" title="plugin:translation" data-wiki-id="plugin:translation">translation</a></li> <li><a href="/plugin:captcha" class="wikilink1" title="plugin:captcha" data-wiki-id="plugin:captcha">captcha</a></li> <li><a href="/plugin:graphviz" class="wikilink1" title="plugin:graphviz" data-wiki-id="plugin:graphviz">graphviz</a></li> <li><a href="/plugin:acl" class="wikilink1" title="plugin:acl" data-wiki-id="plugin:acl">acl</a></li> <li><a href="/plugin:info" class="wikilink1" title="plugin:info" data-wiki-id="plugin:info">info</a></li> <li><a href="/plugin:ditaa" class="wikilink1" title="plugin:ditaa" data-wiki-id="plugin:ditaa">ditaa</a></li> <li>and 60 more</li></ul></div></div> <p> <img src="/lib/images/smileys/exclaim.svg" class="icon smiley" alt=":!:" /> <strong>The authMySQL plugin is </strong><a href="/devel:deprecated" class="wikilink1" title="devel:deprecated" data-wiki-id="devel:deprecated">deprecated</a><strong>.<br/> Please use its replacement: the <a href="/plugin:authpdo" class="wikilink1" title="plugin:authpdo" data-wiki-id="plugin:authpdo">authPDO</a> plugin.</strong> The authMySQL plugin was bundled up to Greebo (2018-04-22). </p> </div> <div class="secedit editbutton_section editbutton_1"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[MySQL Authentication Plugin] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="mysql_authentication_plugin" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1-717" /><button type="submit" title="MySQL Authentication Plugin">Edit</button></div></form></div> <h2 class="sectionedit2" id="description">Description</h2> <div class="level2"> <p> This backend uses a MySQL Database to store user data and passwords. </p> <p> Any database that contains basic user and group information could be used with DokuWiki. How you adapt the SQL statements to match your favorite database will be discussed in this page. All configuration and SQL statements are tested with MySQL 4.0 and are based on the <a href="#example_database" title="plugin:authmysql ↵" class="wikilink1">example database</a> structure below. The backend is able to work with MySQL 3.23, too, but needs slightly modified SQL statements. </p> </div> <div class="secedit editbutton_section editbutton_2"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Description] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="description" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="718-1216" /><button type="submit" title="Description">Edit</button></div></form></div> <h2 class="sectionedit3" id="usage">Usage</h2> <div class="level2"> <p> Before this plugin can be used, you need to setup some settings: </p> <ol> <li class="level1"><div class="li"> Activate the authMySQL plugin in the <a href="/plugin:extension" class="wikilink1" title="plugin:extension" data-wiki-id="plugin:extension">Extension Manager</a>.</div> </li> <li class="level1"><div class="li"> Define the database in the <a href="/plugin:config" class="wikilink1" title="plugin:config" data-wiki-id="plugin:config">Configuration Manager</a></div> </li> <li class="level1"><div class="li"> Define also the statements that performs the authentication and administration actions.</div> </li> <li class="level1"><div class="li"> Switch on this Auth plugin via the configuration option <a href="/config:authtype" class="wikilink1" title="config:authtype" data-wiki-id="config:authtype">authtype</a> by selecting <code>authmysql</code>.</div> </li> </ol> <p> The example configuration explained on this page assumes to uses a database which is <a href="#example_database" title="plugin:authmysql ↵" class="wikilink1">setup below</a>, this can be modified to your own database setup. </p> <p> Administration of users and its groups can be done in the <a href="/plugin:usermanager" class="wikilink1" title="plugin:usermanager" data-wiki-id="plugin:usermanager">User manager</a>, when the needed functions are supplied by this plugin. </p> </div> <div class="secedit editbutton_section editbutton_3"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Usage] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="usage" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1217-1959" /><button type="submit" title="Usage">Edit</button></div></form></div> <h2 class="sectionedit4" id="real_world_examples">Real World Examples</h2> <div class="level2"> <p> Before you go forward to <a href="#configuration" title="plugin:authmysql ↵" class="wikilink1">Configuration</a> section, let&#039;s see quickly how many and what kind of real world configurations of MySQL Authentication exist. The variation reflects the flexibility SQL is offering. </p> <ul> <li class="level1"><div class="li"> <a href="/plugin:authmysql:unb" class="wikilink1" title="plugin:authmysql:unb" data-wiki-id="plugin:authmysql:unb">Unclassified News Board</a> (<a href="http://newsboard.unclassified.de/" class="urlextern" title="http://newsboard.unclassified.de/">UNB</a>) - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:unb2" class="wikilink1" title="plugin:authmysql:unb2" data-wiki-id="plugin:authmysql:unb2">Another Unclassified News Board</a> (<a href="http://newsboard.unclassified.de/" class="urlextern" title="http://newsboard.unclassified.de/">UNB</a>) - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:phorum" class="wikilink1" title="plugin:authmysql:phorum" data-wiki-id="plugin:authmysql:phorum">Phorum</a> - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:fudforum" class="wikilink1" title="plugin:authmysql:fudforum" data-wiki-id="plugin:authmysql:fudforum">FUDforum</a> - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:invision" class="wikilink1" title="plugin:authmysql:invision" data-wiki-id="plugin:authmysql:invision">InvisionBoard</a> - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:phpbb" class="wikilink1" title="plugin:authmysql:phpbb" data-wiki-id="plugin:authmysql:phpbb">phpBB Board</a> - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:flyspray" class="wikilink1" title="plugin:authmysql:flyspray" data-wiki-id="plugin:authmysql:flyspray">Flyspray</a> - a bug tracker</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:drupal" class="wikilink1" title="plugin:authmysql:drupal" data-wiki-id="plugin:authmysql:drupal">Drupal</a> - a fine content management system (<abbr title="Content Management System">CMS</abbr>)</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:e107" class="wikilink1" title="plugin:authmysql:e107" data-wiki-id="plugin:authmysql:e107">e107</a> - another fine content management system (<abbr title="Content Management System">CMS</abbr>)</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:nucleus" class="wikilink1" title="plugin:authmysql:nucleus" data-wiki-id="plugin:authmysql:nucleus">Nucleus</a> - a powerful blogging system </div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:gallery2" class="wikilink1" title="plugin:authmysql:gallery2" data-wiki-id="plugin:authmysql:gallery2">Gallery2</a> - a gallery: <a href="http://gallery.menalto.com" class="urlextern" title="http://gallery.menalto.com">Gallery</a></div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:nuked-klan" class="wikilink1" title="plugin:authmysql:nuked-klan" data-wiki-id="plugin:authmysql:nuked-klan">Nuked Klan</a> - a <abbr title="Content Management System">CMS</abbr> for gamers :<a href="http://www.nuked-klan.org" class="urlextern" title="http://www.nuked-klan.org">Nuked Klan</a></div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:postnuke" class="wikilink1" title="plugin:authmysql:postnuke" data-wiki-id="plugin:authmysql:postnuke">PostNuke</a> - a <abbr title="Content Management System">CMS</abbr> <a href="http://www.postnuke.org" class="urlextern" title="http://www.postnuke.org">http://www.postnuke.org</a></div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:smf" class="wikilink1" title="plugin:authmysql:smf" data-wiki-id="plugin:authmysql:smf">Simple Machines Forum</a> - Simple Machines Forum <a href="http://www.simplemachines.org" class="urlextern" title="http://www.simplemachines.org">http://www.simplemachines.org</a></div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:projectpier" class="wikilink1" title="plugin:authmysql:projectpier" data-wiki-id="plugin:authmysql:projectpier">ProjectPier</a> - collaboration system: <a href="http://projectpier.org" class="urlextern" title="http://projectpier.org">http://projectpier.org</a></div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:typo3" class="wikilink1" title="plugin:authmysql:typo3" data-wiki-id="plugin:authmysql:typo3">Typo3</a> - an enterprise related content management system (<abbr title="Content Management System">CMS</abbr>)</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:contao" class="wikilink1" title="plugin:authmysql:contao" data-wiki-id="plugin:authmysql:contao">Contao</a> - a content management system (<abbr title="Content Management System">CMS</abbr>)</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:vbulletin" class="wikilink1" title="plugin:authmysql:vbulletin" data-wiki-id="plugin:authmysql:vbulletin">VBulletin</a> - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:wbb" class="wikilink1" title="plugin:authmysql:wbb" data-wiki-id="plugin:authmysql:wbb">Woltlab Burning Board</a> - a message board / forum</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:moodle" class="wikilink1" title="plugin:authmysql:moodle" data-wiki-id="plugin:authmysql:moodle">Moodle</a> - an elearning system</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:wordpress_4.0" class="wikilink1" title="plugin:authmysql:wordpress_4.0" data-wiki-id="plugin:authmysql:wordpress_4.0">Wordpress &gt;= 4.0</a> - a blogging system</div> </li> <li class="level1"><div class="li"> <a href="/plugin:authmysql:zentao" class="wikilink1" title="plugin:authmysql:zentao" data-wiki-id="plugin:authmysql:zentao">Zentao</a> - a project management system</div> </li> </ul> <p> Config based on the old Auth backend:<br/> (needs renaming <code>$conf[&#039;auth&#039;][&#039;mysql&#039;]</code> to <code>$conf[&#039;plugin&#039;][&#039;authmysql&#039;]</code>) </p> <ul> <li class="level1"><div class="li"> <a href="http://thedeadone.net/software/getting-dokuwiki-to-use-wordpress-authentication/" class="urlextern" title="http://thedeadone.net/software/getting-dokuwiki-to-use-wordpress-authentication/">WordPress &lt; 4.0</a> - a blogging system </div> </li> </ul> <hr /> </div> <div class="secedit editbutton_section editbutton_4"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Real World Examples] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="real_world_examples" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1960-4318" /><button type="submit" title="Real World Examples">Edit</button></div></form></div> <h2 class="sectionedit5" id="configuration">Configuration</h2> <div class="level2"> <p> Prior to enable <strong>authmysql</strong> plugin, you need to configure many options such as your database and at least the SQL statements that perform the authentication and basic administration actions. In the <a href="/plugin:config" class="wikilink1" title="plugin:config" data-wiki-id="plugin:config">Configuration Manager</a>, you will find “Authmysql Plugin Settings” under “Plugin Settings” section. </p> <p> This auth plugin will be enabled with the <a href="/config:authtype" class="wikilink1" title="config:authtype" data-wiki-id="config:authtype">authtype</a> configuration option by selecting <code>authmysql</code>, which is found in the “Authentication Settings” under “DokuWiki Settings” section. </p> <p> There are more general <a href="/config#available_options" class="wikilink1" title="config" data-wiki-id="config">authentication related settings</a> available too. </p> </div> <div class="secedit editbutton_section editbutton_5"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Configuration] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="configuration" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="4319-4950" /><button type="submit" title="Configuration">Edit</button></div></form></div> <h2 class="sectionedit6" id="how_to_configure_authmysql_plugin">How to configure authmysql plugin</h2> <div class="level2"> <p> There are many approaches to configure this auth plugin. You may mix more than one approach shown below, depending on your own requirements and preferences. </p> <ol> <li class="level1"><div class="li"> use Configuration manager interface – your settings are kept in <code>conf/local.php</code></div> </li> <li class="level1"><div class="li"> define configuration options in <code>conf/local.protected.php</code></div> </li> <li class="level1"><div class="li"> define options in any php file (<code>mysql.conf.php</code>, for example) and include it in <code>conf/local.protected.php</code> </div> </li> </ol> <p> If you setup authmysql plugin configuration using <a href="/plugin:config" class="wikilink1" title="plugin:config" data-wiki-id="plugin:config">Configuration Manager</a>, your auth settings are stored in <code>conf/local.php</code>. But please be careful of unintentional change of your configuration. In order to avoid eventual loss of your configuration, especially of user authentication, it is preferable that auth settings should be defined in <code>conf/local.protected.php</code> (please create it if it doesn&#039;t exist). </p> <p> The common settings for AuthMySQL plugin will be found in <code><a href="https://github.com/dokuwiki/dokuwiki/blob/master/conf/mysql.conf.php.example" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/blob/master/conf/mysql.conf.php.example">conf/mysql.conf.php.example</a></code> which is included in the DokuWiki distribution. You can copy it to another file (<code>mysql.conf.php</code> for example), and edit the file to fit your needs. (This way you don&#039;t have to try and copy/paste all the code below). Then edit <code>conf/local.protected.php</code> for your settings to be loaded by your DokuWiki installation like: </p> <dl class="code"> <dt><a href="/_export/code/plugin:authmysql?codeblock=0" title="Download Snippet" class="mediafile mf_php">conf/local.protected.php</a></dt> <dd><pre class="code php"><span class="kw2">&lt;?php</span> <span class="co1">// include config for MySQL backend</span> <span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'mysql.conf.php'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre> </dd></dl> </div> <div class="secedit editbutton_section editbutton_6"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[How to configure authmysql plugin] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="how_to_configure_authmysql_plugin" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="4951-6472" /><button type="submit" title="How to configure authmysql plugin">Edit</button></div></form></div> <h2 class="sectionedit7" id="how_to_enable_authmysql_authentication">How to enable authMySQL authentication</h2> <div class="level2"> <p> Some checks and actions needed before enabling this backend. </p> </div> <div class="secedit editbutton_section editbutton_7"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[How to enable authMySQL authentication] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="how_to_enable_authmysql_authentication" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="6473-6585" /><button type="submit" title="How to enable authMySQL authentication">Edit</button></div></form></div> <h3 class="sectionedit8" id="adding_the_superuser_to_the_new_mysql_tables">Adding the Superuser to the new MySQL Tables</h3> <div class="level3"> <p> When you start with an empty database, you need to add a user into your database that is the <a href="/config:superuser" class="wikilink1" title="config:superuser" data-wiki-id="config:superuser">superuser</a>. The easiest way to add the superuser into your MySQL authentication environment is using the Add User capability in the User Manager interface, after switching to the authMySQL authentication. Just remember not to log out before adding the superuser, and remember to include him/her in both the admin and user groups. Of course you need to have a authMySQL plugin configuration that support adding users, otherwise you should use your database software or an external interface with database editing capabilities. </p> <p> If for some reason you mess up and do log out before adding the superuser, and you have no external access to your database, use shell access to edit the <code>conf/local.php</code> file to change <code>$conf[&#039;authtype&#039;]</code> back to <code>authplain</code>. That should let you log back in with the “original” superuser (i.e., the one you set up when first setting up Dokuwiki). </p> <p> Note: The file <code>conf/users.auth.php</code> will <strong>not</strong> used for user authentication any more after this authMySQL has enabled. </p> </div> <div class="secedit editbutton_section editbutton_8"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Adding the Superuser to the new MySQL Tables] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="adding_the_superuser_to_the_new_mysql_tables" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="6586-7750" /><button type="submit" title="Adding the Superuser to the new MySQL Tables">Edit</button></div></form></div> <h3 class="sectionedit9" id="configure_the_superuser_in_wiki">Configure the Superuser in wiki</h3> <div class="level3"> <p> When you start with non-empty database, from for example another application, which already defines administrator roles usable for your wiki you can set them in DokuWiki. Therefore you need to set the <a href="/config:superuser" class="wikilink1" title="config:superuser" data-wiki-id="config:superuser">superuser</a> and eventually the <a href="/config:manager" class="wikilink1" title="config:manager" data-wiki-id="config:manager">manager</a> in the Configuration Manager. </p> </div> <div class="secedit editbutton_section editbutton_9"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Configure the Superuser in wiki] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="configure_the_superuser_in_wiki" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="7751-8083" /><button type="submit" title="Configure the Superuser in wiki">Edit</button></div></form></div> <h3 class="sectionedit10" id="enable_mysql_authentication">Enable MySQL Authentication</h3> <div class="level3"> <p> This auth plugin will be enabled with the <a href="/config:authtype" class="wikilink1" title="config:authtype" data-wiki-id="config:authtype">authtype</a> configuration option by selecting <code>authmysql</code>, which is found in the “Authentication Settings” under “DokuWiki Settings” section. </p> <p> Instead, if you want lock <a href="/config:authtype" class="wikilink1" title="config:authtype" data-wiki-id="config:authtype">authtype</a> to avoid eventual / unintentional change, define following setting in <code>conf/local.protected.php</code>. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'authtype'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;authmysql&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_10"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Enable MySQL Authentication] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="enable_mysql_authentication" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="8084-8517" /><button type="submit" title="Enable MySQL Authentication">Edit</button></div></form></div> <h2 class="sectionedit11" id="plugin_configuration_settings">Plugin Configuration settings</h2> <div class="level2"> <p> Prior to enable authmysql plugin, you need to configure many options such as your database and each SQL statements that performs the authentication and administration actions. </p> <p> All options explained assuming to use with a <a href="#example_database" title="plugin:authmysql ↵" class="wikilink1">Sample Database</a> which stores the first and last name of the users in one field. The common example for AuthMySQL plugin – <code><a href="https://github.com/dokuwiki/dokuwiki/blob/master/conf/mysql.conf.php.example" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/blob/master/conf/mysql.conf.php.example">conf/mysql.conf.php.example</a></code> – included in the DokuWiki distribution also assumes the sample database database. At the bottom of this page is also an example how to <a href="#store_first_and_last_name_separated" title="plugin:authmysql ↵" class="wikilink1">Store first and last name separated</a>. </p> </div> <div class="secedit editbutton_section editbutton_11"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Plugin Configuration settings] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="plugin_configuration_settings" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="8518-9221" /><button type="submit" title="Plugin Configuration settings">Edit</button></div></form></div> <h3 class="sectionedit12" id="option_server">Option &#039;server&#039;</h3> <div class="level3"> <p> This option defines the MySQL server to connect to. If you are running MySQL on the same server as your DokuWiki installation, &#039;localhost&#039; would be sufficient. Otherwise put in your remote MySQL server here. Keep in mind that the remote database server must allow access from your DokuWiki server. See MySQL documentation for details on this issue. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'localhost'</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_12"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Option &#039;server&#039;] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="option_server" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="9222-9672" /><button type="submit" title="Option &#039;server&#039;">Edit</button></div></form></div> <h3 class="sectionedit13" id="option_user">Option &#039;user&#039;</h3> <div class="level3"> <p> This option defines which user DokuWiki should use to access the database. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'user'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'dbuser'</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_13"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Option &#039;user&#039;] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="option_user" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="9673-9841" /><button type="submit" title="Option &#039;user&#039;">Edit</button></div></form></div> <h3 class="sectionedit14" id="option_password">Option &#039;password&#039;</h3> <div class="level3"> <p> Set the database password for &#039;user&#039; here. Because it is entered in clear text some additional security prophylaxes should be performed. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'password'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'dbpassword'</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_14"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Option &#039;password&#039;] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="option_password" /><input type="hidden" name="codeblockOffset" value="4" /><input type="hidden" name="range" value="9842-10084" /><button type="submit" title="Option &#039;password&#039;">Edit</button></div></form></div> <h3 class="sectionedit15" id="option_database">Option &#039;database&#039;</h3> <div class="level3"> <p> Last but not least you need to specify the database that stores all the user information. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'database'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'users'</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_15"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Option &#039;database&#039;] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="option_database" /><input type="hidden" name="codeblockOffset" value="5" /><input type="hidden" name="range" value="10085-10275" /><button type="submit" title="Option &#039;database&#039;">Edit</button></div></form></div> <h3 class="sectionedit16" id="option_debug">Option &#039;debug&#039;</h3> <div class="level3"> <p> Setting this option to <code>1</code> will print out all SQL errors that occur on executing the auth plugin. This is useful during configuring the backend but should be disabled when everything works. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'debug'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span></pre> <p> You can set this option to <code>2</code> to make it print every SQL query that is sent to the database. </p> </div> <div class="secedit editbutton_section editbutton_16"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Option &#039;debug&#039;] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="option_debug" /><input type="hidden" name="codeblockOffset" value="6" /><input type="hidden" name="range" value="10276-10655" /><button type="submit" title="Option &#039;debug&#039;">Edit</button></div></form></div> <h3 class="sectionedit17" id="option_forwardclearpass">Option &#039;forwardClearPass&#039;</h3> <div class="level3"> <p> Normally password encryption is done by DokuWiki (recommended) but for some reasons it might be useful to let the database do the encryption. Set &#039;forwardClearPass&#039; to &#039;0&#039; and DokuWiki do the password encryption. Different encryption algorithms are possible. See Chapter <a href="/config:passcrypt" class="wikilink1" title="config:passcrypt" data-wiki-id="config:passcrypt">Configuration</a> for full list </p> <p> <img src="/lib/images/smileys/exclaim.svg" class="icon smiley" alt=":!:" /> If you set &#039;forwardClearPass&#039; to 1 the backend expects the database to do the crypting. It will forward the clear text password to the database. Be aware of the security risk. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'forwardClearPass'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_17"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Option &#039;forwardClearPass&#039;] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="option_forwardclearpass" /><input type="hidden" name="codeblockOffset" value="7" /><input type="hidden" name="range" value="10656-11269" /><button type="submit" title="Option &#039;forwardClearPass&#039;">Edit</button></div></form></div> <h3 class="sectionedit18" id="option_tablestolock">Option &#039;TablesToLock&#039;</h3> <div class="level3"> <p> Multiple table operations will be protected by locks. This array tells the module which tables to lock. If you use any aliases for table names the array must also contain these aliases. Any not named alias will cause a warning during operation. </p> <p> MySQL 3.23 doesn&#039;t support transactions so that this mechanism is simulated with LOCK TABLES to be downwards compatible. Future versions of this backend may support transactions natively. </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'TablesToLock'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;users&quot;</span><span class="sy0">,</span> <span class="st0">&quot;users AS u&quot;</span><span class="sy0">,</span> <span class="st0">&quot;groups&quot;</span><span class="sy0">,</span> <span class="st0">&quot;groups AS g&quot;</span><span class="sy0">,</span> <span class="st0">&quot;usergroup&quot;</span><span class="sy0">,</span> <span class="st0">&quot;usergroup AS ug&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_18"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Option &#039;TablesToLock&#039;] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="option_tablestolock" /><input type="hidden" name="codeblockOffset" value="8" /><input type="hidden" name="range" value="11270-11905" /><button type="submit" title="Option &#039;TablesToLock&#039;">Edit</button></div></form></div> <h2 class="sectionedit19" id="sql_user_authentication">SQL User Authentication</h2> <div class="level2"> <p> The SQL statements in this section are necessary to use DokuWiki with the MySQL authentication backend. They are the minimum set you have to define. </p> </div> <div class="secedit editbutton_section editbutton_19"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[SQL User Authentication] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="sql_user_authentication" /><input type="hidden" name="codeblockOffset" value="9" /><input type="hidden" name="range" value="11906-12091" /><button type="submit" title="SQL User Authentication">Edit</button></div></form></div> <h3 class="sectionedit20" id="checkpass">checkPass</h3> <div class="level3"> <p> This statement is used to grant or deny access to the wiki. The result should be a table with exact one line containing at least the password of the user. If the result table is empty or contains more than one row, access will be denied. The module access the password as &#039;pass&#039; so an alias might be necessary. </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by a user name</div> </li> <li class="level1"><div class="li"> <code>%{pass}</code> will be replaced by an encrypted or clear text password (depends on &#039;forwardClearPass&#039;)</div> </li> <li class="level1"><div class="li"> <code>%{dgroup}</code> will be replaced by the default group name </div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'checkPass'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT pass FROM usergroup AS ug JOIN users AS u ON u.uid=ug.uid JOIN groups AS g ON g.gid=ug.gid WHERE login='%{user}' AND name='%{dgroup}'&quot;</span><span class="sy0">;</span></pre> <p> If you share the user database with other applications it might be useful to be able to define which user may access the Wiki. Okay, the main spirit of a Wiki is it <em class="u"><strong>not</strong></em> to limit the access and give all users the possibility to participate. But hey, you are reading an article about access control, what did you expect? So let us get the donkey from the ice. </p> <p> As already mentioned we have a user database but not every user in this database should be allowed to log into the wiki. The easiest way to check this is the DokuWiki <code>defaultgroup</code>. Every new DokuWiki user will automatically be a member of this group so all we have to do is to check the group besides the password at login time. </p> <p> The above SQL statement already does this with <code>name=&#039;%{dgroup}&#039;</code>. </p> <p> <img src="/lib/images/smileys/exclaim.svg" class="icon smiley" alt=":!:" /> <strong>Potential Security vulnerability</strong>: If you set &#039;forwardClearPass = 1&#039; the password must be verified from the database. An additional WHERE clause will do the job: <code>AND pass = MD5(&#039;%pass&#039;)</code>. Otherwise, anyone can login by providing any registered username only! </p> <p> A much better way is and I really recommend to do it this way is to set &#039;forwardClearPass = 0&#039; and let DokuWiki do the crypting. </p> </div> <div class="secedit editbutton_section editbutton_20"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[checkPass] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="checkpass" /><input type="hidden" name="codeblockOffset" value="9" /><input type="hidden" name="range" value="12092-14259" /><button type="submit" title="checkPass">Edit</button></div></form></div> <h3 class="sectionedit21" id="getuserinfo">getUserInfo</h3> <div class="level3"> <p> This statement should return a table with exact one row containing information about one user. The needed field names are: </p> <ul> <li class="level1"><div class="li"> &#039;pass&#039; containing the encrypted or clear text password </div> </li> <li class="level1"><div class="li"> &#039;name&#039; the user&#039;s full name</div> </li> <li class="level1"><div class="li"> &#039;mail&#039; the user&#039;s email address</div> </li> </ul> <p> Keep in mind that DokuWiki will access these information through the names listed above so aliases might be necessary. </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by a user name</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getUserInfo'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT pass, fullname AS name, email AS mail FROM users WHERE login='%{user}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_21"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[getUserInfo] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="getuserinfo" /><input type="hidden" name="codeblockOffset" value="10" /><input type="hidden" name="range" value="14260-14945" /><button type="submit" title="getUserInfo">Edit</button></div></form></div> <h3 class="sectionedit22" id="getgroups">getGroups</h3> <div class="level3"> <p> This statement is used to get all groups a user is member of. The result should be a table containing all groups the given user is member of. The module access the group name as &#039;group&#039; so an alias might be necessary. </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by a user name</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getGroups'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT name as `group` FROM groups g, users u, usergroup ug WHERE u.uid = ug.uid AND g.gid = ug.gid AND u.login='%{user}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_22"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[getGroups] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="getgroups" /><input type="hidden" name="codeblockOffset" value="11" /><input type="hidden" name="range" value="14946-15612" /><button type="submit" title="getGroups">Edit</button></div></form></div> <h2 class="sectionedit23" id="sql_basic_user_manager_support">SQL Basic User Manager Support</h2> <div class="level2"> <p> The SQL statements in this section are necessary to use the user manager plugin. They set up only basic support and you will only be able to get and display the user list. </p> </div> <div class="secedit editbutton_section editbutton_23"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[SQL Basic User Manager Support] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="sql_basic_user_manager_support" /><input type="hidden" name="codeblockOffset" value="12" /><input type="hidden" name="range" value="15613-15828" /><button type="submit" title="SQL Basic User Manager Support">Edit</button></div></form></div> <h3 class="sectionedit24" id="getusers">getUsers</h3> <div class="level3"> <p> This statement should return a table containing all user login names that meet certain filter criteria. The filter expressions will be added case dependent by the module. At the end a sort expression will be added. </p> <p> Important is that this list contains no double entries to a user. Each user name is only allowed once in the table. </p> <p> The login name will be accessed as &#039;user&#039; to an alias might be necessary. No patterns will be replaced in this statement but following patters will be replaced in the filter expressions: </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> in FilterLogin will be replaced by a user name</div> </li> <li class="level1"><div class="li"> <code>%{name}</code> in FilterName will be replaced by user&#039;s full name</div> </li> <li class="level1"><div class="li"> <code>%{email}</code> in FilterEmail will be replaced by user&#039;s email address</div> </li> <li class="level1"><div class="li"> <code>%{group}</code> in FilterGroup will be replaced by a group name</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getUsers'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT DISTINCT login AS user FROM users AS u LEFT JOIN usergroup AS ug ON u.uid=ug.uid LEFT JOIN groups AS g ON ug.gid=g.gid&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterLogin'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;login LIKE '%{user}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterName'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;fullname LIKE '%{name}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterEmail'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;email LIKE '%{email}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterGroup'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;name LIKE '%{group}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'SortOrder'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;ORDER BY login&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_24"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[getUsers] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="getusers" /><input type="hidden" name="codeblockOffset" value="12" /><input type="hidden" name="range" value="15829-17323" /><button type="submit" title="getUsers">Edit</button></div></form></div> <h2 class="sectionedit25" id="sql_support_for_add_user">SQL Support for Add User</h2> <div class="level2"> <p> You additionally need the SQL statements in this section if you want to add new users in the database with the user manager. </p> </div> <div class="secedit editbutton_section editbutton_25"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[SQL Support for Add User] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="sql_support_for_add_user" /><input type="hidden" name="codeblockOffset" value="13" /><input type="hidden" name="range" value="17324-17486" /><button type="submit" title="SQL Support for Add User">Edit</button></div></form></div> <h3 class="sectionedit26" id="adduser">addUser</h3> <div class="level3"> <p> This statement should add a user to the database. Minimum information to store are: login name, password, email address and full name. </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by the user name</div> </li> <li class="level1"><div class="li"> <code>%{pass}</code> will be replaced by the password (encrypted or clear text, depends on &#039;forwardClearPass&#039;)</div> </li> <li class="level1"><div class="li"> <code>%{email}</code> will be replaced by user&#039;s email address</div> </li> <li class="level1"><div class="li"> <code>%{name}</code> will be replaced by user&#039;s full name</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'addUser'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;INSERT INTO users (login, pass, email, fullname) VALUES ('%{user}', '%{pass}', '%{email}', '%{name}')&quot;</span><span class="sy0">;</span></pre> <p> Please keep in mind that if you set &#039;forwardClearPass = 1&#039; the clear text password is filled in here. You should at least replace <code>%{pass}</code> with <code>MD5(&#039;%{pass}&#039;)</code> or better set &#039;forwardClearPass = 0&#039; and let DokuWiki do the crypting. I really recommend the second method. </p> </div> <div class="secedit editbutton_section editbutton_26"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[addUser] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="adduser" /><input type="hidden" name="codeblockOffset" value="13" /><input type="hidden" name="range" value="17487-18450" /><button type="submit" title="addUser">Edit</button></div></form></div> <h3 class="sectionedit27" id="addgroup">addGroup</h3> <div class="level3"> <p> This statement should add a group to the database. </p> <ul> <li class="level1"><div class="li"> <code>%{group}</code> will be replaced by a group name</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'addGroup'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;INSERT INTO groups (name) VALUES ('%{group}')&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_27"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[addGroup] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="addgroup" /><input type="hidden" name="codeblockOffset" value="14" /><input type="hidden" name="range" value="18451-18734" /><button type="submit" title="addGroup">Edit</button></div></form></div> <h3 class="sectionedit28" id="addusergroup">addUserGroup</h3> <div class="level3"> <p> This statement should connect a user to a group (a user become member of that group). </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by a user name</div> </li> <li class="level1"><div class="li"> <code>%{uid}</code> will be replaced by the id of a user data-set</div> </li> <li class="level1"><div class="li"> <code>%{group}</code> will be replaced by a group name</div> </li> <li class="level1"><div class="li"> <code>%{gid}</code> will be replaced by the id of a group data-set</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'addUserGroup'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st0">&quot;INSERT INTO usergroup (uid, gid) VALUES ('%{uid}', '%{gid}')&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_28"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[addUserGroup] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="addusergroup" /><input type="hidden" name="codeblockOffset" value="15" /><input type="hidden" name="range" value="18735-19243" /><button type="submit" title="addUserGroup">Edit</button></div></form></div> <h3 class="sectionedit29" id="delgroup">delGroup</h3> <div class="level3"> <p> This statement should remove a group from the database. </p> <ul> <li class="level1"><div class="li"> <code>%{group}</code> will be replaced by the group name</div> </li> <li class="level1"><div class="li"> <code>%{gid}</code> will be replaced by the id of a group data-set</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delGroup'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;DELETE FROM groups WHERE gid='%{gid}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_29"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[delGroup] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="delgroup" /><input type="hidden" name="codeblockOffset" value="16" /><input type="hidden" name="range" value="19244-19588" /><button type="submit" title="delGroup">Edit</button></div></form></div> <h3 class="sectionedit30" id="getuserid">getUserID</h3> <div class="level3"> <p> This statement should return the database index of a given user name. The module will access the index with the name &#039;id&#039; so an alias might be necessary. </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by the user name </div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getUserID'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT uid AS id FROM users WHERE login='%{user}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_30"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[getUserID] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="getuserid" /><input type="hidden" name="codeblockOffset" value="17" /><input type="hidden" name="range" value="19589-19934" /><button type="submit" title="getUserID">Edit</button></div></form></div> <h3 class="sectionedit31" id="getgroupid">getGroupID</h3> <div class="level3"> <p> This statement should return the database index of a given group name. The module will access the index with the name &#039;id&#039; so an alias might be necessary. </p> <ul> <li class="level1"><div class="li"> <code>%{group}</code> will be replaced by the group name </div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getGroupID'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT gid AS id FROM groups WHERE name='%{group}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_31"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[getGroupID] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="getgroupid" /><input type="hidden" name="codeblockOffset" value="18" /><input type="hidden" name="range" value="19935-20285" /><button type="submit" title="getGroupID">Edit</button></div></form></div> <h2 class="sectionedit32" id="sql_support_for_delete_user">SQL Support for Delete User</h2> <div class="level2"> <p> You additionally need the SQL statements in this section if you want to remove users from the database with the user manager. </p> </div> <div class="secedit editbutton_section editbutton_32"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[SQL Support for Delete User] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="sql_support_for_delete_user" /><input type="hidden" name="codeblockOffset" value="19" /><input type="hidden" name="range" value="20286-20452" /><button type="submit" title="SQL Support for Delete User">Edit</button></div></form></div> <h3 class="sectionedit33" id="deluser">delUser</h3> <div class="level3"> <p> This statement should remove a user from the database. </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by the user name</div> </li> <li class="level1"><div class="li"> <code>%{uid}</code> will be replaced by the id of a user data-set</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delUser'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;DELETE FROM users WHERE uid='%{uid}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_33"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[delUser] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="deluser" /><input type="hidden" name="codeblockOffset" value="19" /><input type="hidden" name="range" value="20453-20791" /><button type="submit" title="delUser">Edit</button></div></form></div> <h3 class="sectionedit34" id="deluserrefs">delUserRefs</h3> <div class="level3"> <p> This statement should remove all connections from a user to any group (a user quits membership of all groups). </p> <ul> <li class="level1"><div class="li"> <code>%{uid}</code> will be replaced by the id of a user data-set</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delUserRefs'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;DELETE FROM usergroup WHERE uid='%{uid}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_34"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[delUserRefs] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="deluserrefs" /><input type="hidden" name="codeblockOffset" value="20" /><input type="hidden" name="range" value="20792-21144" /><button type="submit" title="delUserRefs">Edit</button></div></form></div> <h2 class="sectionedit35" id="sql_support_for_modify_user">SQL Support for Modify User</h2> <div class="level2"> </div> <div class="secedit editbutton_section editbutton_35"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[SQL Support for Modify User] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="sql_support_for_modify_user" /><input type="hidden" name="codeblockOffset" value="21" /><input type="hidden" name="range" value="21145-21185" /><button type="submit" title="SQL Support for Modify User">Edit</button></div></form></div> <h3 class="sectionedit36" id="updateuser">updateUser</h3> <div class="level3"> <p> This statements should modify a user entry in the database. The statements UpdateLogin, UpdatePass, UpdateEmail and UpdateName will be added to updateUser on demand. Only changed parameters will be used. </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaces by the user name</div> </li> <li class="level1"><div class="li"> <code>%{pass}</code> will be replaced by the encrypted or clear text password (depends on &#039;forwardClearPass&#039;)</div> </li> <li class="level1"><div class="li"> <code>%{email}</code> will be replaced by the email address</div> </li> <li class="level1"><div class="li"> <code>%{name}</code> will be replaced by the user&#039;s full name</div> </li> <li class="level1"><div class="li"> <code>%{uid}</code> will be replaced by the user id that should be updated</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'updateUser'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;UPDATE users SET&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateLogin'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;login='%{user}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdatePass'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;pass='%{pass}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateEmail'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;email='%{email}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateName'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;fullname='%{name}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateTarget'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st0">&quot;WHERE uid=%{uid}&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_36"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[updateUser] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="updateuser" /><input type="hidden" name="codeblockOffset" value="21" /><input type="hidden" name="range" value="21186-22165" /><button type="submit" title="updateUser">Edit</button></div></form></div> <h3 class="sectionedit37" id="delusergroup">delUserGroup</h3> <div class="level3"> <p> This statement should remove a single connection from a user to a group (a user quits membership of that group). </p> <ul> <li class="level1"><div class="li"> <code>%{user}</code> will be replaced by a user name</div> </li> <li class="level1"><div class="li"> <code>%{uid}</code> will be replaced by the id of a user data-set</div> </li> <li class="level1"><div class="li"> <code>%{group}</code> will be replaced by a group name</div> </li> <li class="level1"><div class="li"> <code>%{gid}</code> will be replaced by the id of a group data-set</div> </li> </ul> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delUserGroup'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st0">&quot;DELETE FROM usergroup WHERE uid='%{uid}' AND gid='%{gid}'&quot;</span><span class="sy0">;</span></pre> </div> <div class="secedit editbutton_section editbutton_37"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[delUserGroup] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="delusergroup" /><input type="hidden" name="codeblockOffset" value="22" /><input type="hidden" name="range" value="22166-22745" /><button type="submit" title="delUserGroup">Edit</button></div></form></div> <h2 class="sectionedit38" id="summarized_plugin_configuration">Summarized plugin configuration</h2> <div class="level2"> <p> This is an example of the <code>authmysql</code> plugin configuration. The example is based on the above given SQL statements. Use the Config Manager or add it to the <code>conf/local.protected.php</code> to store the config protected. </p> <dl class="code"> <dt><a href="/_export/code/plugin:authmysql?codeblock=23" title="Download Snippet" class="mediafile mf_php">conf/local.protected.php</a></dt> <dd><pre class="code php"><span class="kw2">&lt;?php</span> <span class="co4">/** * Configuration for MySQL Auth Plugin * See https://www.dokuwiki.org/plugin:authmysql for details and explanation */</span> &nbsp; <span class="co1">//database access</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'localhost'</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'user'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'password'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'database'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span> &nbsp; <span class="co1">//Debug level: 0 = disable, 1 = only mysql errors, 2 = print every sent SQL query </span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'debug'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">;</span> &nbsp; <span class="co1">//multiple table operation needs locks</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'TablesToLock'</span><span class="br0">&#93;</span><span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;users&quot;</span><span class="sy0">,</span> <span class="st0">&quot;users AS u&quot;</span><span class="sy0">,</span> <span class="st0">&quot;groups&quot;</span><span class="sy0">,</span> <span class="st0">&quot;groups AS g&quot;</span><span class="sy0">,</span> <span class="st0">&quot;usergroup&quot;</span><span class="sy0">,</span> <span class="st0">&quot;usergroup AS ug&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; <span class="co1">//Where password encryption is done, 0 by DokuWiki (recommended) or 1 by database</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'forwardClearPass'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> &nbsp; <span class="co4">/** * Basic SQL statements for user authentication (required) */</span> &nbsp; <span class="co1">//This statement is used to grant or deny access to the wiki. </span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'checkPass'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT pass FROM usergroup AS ug JOIN users AS u ON u.uid=ug.uid JOIN groups AS g ON g.gid=ug.gid WHERE login='%{user}' AND name='%{dgroup}'&quot;</span><span class="sy0">;</span> <span class="co1">//Return a table with exact one row containing information about one user</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getUserInfo'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT pass, fullname AS name, email AS mail FROM users WHERE login='%{user}'&quot;</span><span class="sy0">;</span> <span class="co1">//get all groups a user is member of </span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getGroups'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT name as `group` FROM groups g, users u, usergroup ug WHERE u.uid = ug.uid AND g.gid = ug.gid AND u.login='%{user}'&quot;</span><span class="sy0">;</span> <span class="co4">/** * Additional minimum SQL statements to use the user manager */</span> &nbsp; <span class="co1">//return a table containing all user login names that meet certain filter criteria</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getUsers'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT DISTINCT login AS user FROM users AS u LEFT JOIN usergroup AS ug ON u.uid=ug.uid LEFT JOIN groups AS g ON ug.gid=g.gid&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterLogin'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;login LIKE '%{user}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterName'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;fullname LIKE '%{name}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterEmail'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;email LIKE '%{email}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterGroup'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;name LIKE '%{group}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'SortOrder'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;ORDER BY login&quot;</span><span class="sy0">;</span> &nbsp; <span class="co4">/** * Additional SQL statements to add new users with the user manager */</span> &nbsp; <span class="co1">//should add a user to the database</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'addUser'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;INSERT INTO users (login, pass, email, fullname) VALUES ('%{user}', '%{pass}', '%{email}', '%{name}')&quot;</span><span class="sy0">;</span> <span class="co1">//should add a group to the database</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'addGroup'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;INSERT INTO groups (name) VALUES ('%{group}')&quot;</span><span class="sy0">;</span> <span class="co1">//should connect a user to a group (a user become member of that group).</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'addUserGroup'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st0">&quot;INSERT INTO usergroup (uid, gid) VALUES ('%{uid}', '%{gid}')&quot;</span><span class="sy0">;</span> <span class="co1">//This statement should remove a group fom the database</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delGroup'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;DELETE FROM groups WHERE gid='%{gid}'&quot;</span><span class="sy0">;</span> <span class="co1">//This statement should return the database index of a given user name.</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getUserID'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT uid AS id FROM users WHERE login='%{user}'&quot;</span><span class="sy0">;</span> &nbsp; <span class="co4">/** * Additional SQL statements to delete users with the user manager */</span> &nbsp; <span class="co1">//return the database index of a given group name</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getGroupID'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT gid AS id FROM groups WHERE name='%{group}'&quot;</span><span class="sy0">;</span> <span class="co1">//should remove a user fom the database.</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delUser'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;DELETE FROM users WHERE uid='%{uid}'&quot;</span><span class="sy0">;</span> <span class="co1">//This statement should remove all connections from a user to any group</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delUserRefs'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;DELETE FROM usergroup WHERE uid='%{uid}'&quot;</span><span class="sy0">;</span> <span class="co4">/** * Additional SQL statements to modify users with the user manager */</span> &nbsp; <span class="co1">//should modify a user entry in the database</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'updateUser'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;UPDATE users SET&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateLogin'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;login='%{user}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdatePass'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;pass='%{pass}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateEmail'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;email='%{email}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateName'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;fullname='%{name}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateTarget'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st0">&quot;WHERE uid=%{uid}&quot;</span><span class="sy0">;</span> &nbsp; <span class="co1">//should remove a single connection from a user to a group</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'delUserGroup'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st0">&quot;DELETE FROM usergroup WHERE uid='%{uid}' AND gid='%{gid}'&quot;</span><span class="sy0">;</span> </pre> </dd></dl> </div> <div class="secedit editbutton_section editbutton_38"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Summarized plugin configuration] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="summarized_plugin_configuration" /><input type="hidden" name="codeblockOffset" value="23" /><input type="hidden" name="range" value="22746-28553" /><button type="submit" title="Summarized plugin configuration">Edit</button></div></form></div> <h2 class="sectionedit39" id="example_database">Example Database</h2> <div class="level2"> <p> This is a very simple example database. </p> <pre class="code sql"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`users`</span> <span class="br0">&#40;</span> <span class="st0">`uid`</span> <span class="kw1">INT</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span><span class="sy0">,</span> <span class="st0">`login`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="st0">`pass`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="st0">`fullname`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="st0">`email`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="st0">`uid`</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">UNIQUE</span> <span class="kw1">KEY</span> <span class="st0">`login`</span> <span class="br0">&#40;</span><span class="st0">`login`</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> ENGINE <span class="sy0">=</span> MYISAM; &nbsp; <span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`groups`</span> <span class="br0">&#40;</span> <span class="st0">`gid`</span> <span class="kw1">INT</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span><span class="sy0">,</span> <span class="st0">`name`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="st0">`gid`</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">UNIQUE</span> <span class="kw1">KEY</span> <span class="st0">`name`</span> <span class="br0">&#40;</span><span class="st0">`name`</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> ENGINE <span class="sy0">=</span> MYISAM; &nbsp; <span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`usergroup`</span> <span class="br0">&#40;</span> <span class="st0">`uid`</span> <span class="kw1">INT</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">'0'</span><span class="sy0">,</span> <span class="st0">`gid`</span> <span class="kw1">INT</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">'0'</span><span class="sy0">,</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="st0">`uid`</span><span class="sy0">,</span><span class="st0">`gid`</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> ENGINE <span class="sy0">=</span> MYISAM;</pre> </div> <div class="secedit editbutton_section editbutton_39"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Example Database] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="example_database" /><input type="hidden" name="codeblockOffset" value="24" /><input type="hidden" name="range" value="28554-29327" /><button type="submit" title="Example Database">Edit</button></div></form></div> <h2 class="sectionedit40" id="store_first_and_last_name_separated">Store first and last name separated</h2> <div class="level2"> <p> Storing the <code>fullname</code> in one single database field may be sufficient for some basic tasks but it has a lot of advantages to split the name up in <code>firstname</code> and <code>lastname</code>. Only one table of the above example need some tuning to get this to work: </p> <pre class="code sql"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`users`</span> <span class="br0">&#40;</span> <span class="st0">`uid`</span> <span class="kw1">INT</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span><span class="sy0">,</span> <span class="st0">`login`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="st0">`pass`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="st0">`firstname`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="st0">`lastname`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="st0">`email`</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">''</span><span class="sy0">,</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="st0">`uid`</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">UNIQUE</span> <span class="kw1">KEY</span> <span class="st0">`login`</span> <span class="br0">&#40;</span><span class="st0">`login`</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="kw1">TYPE</span> <span class="sy0">=</span> MYISAM;</pre> <p> To use this slightly changed structure without the need to recode major parts of DokuWiki, it becomes necessary to modify some of our SQL statements: </p> <pre class="code php"><span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'getUserInfo'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail FROM users WHERE login='%{user}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'addUser'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;INSERT INTO users (login, pass, email, firstname, lastname) VALUES ('%{user}', '%{pass}', '%{email}', SUBSTRING('%{name}', 1, LOCATE(' ', '%{name}')), IF(Length('%{name}') = Length(REPLACE('%{name}', ' ', '')),'',SUBSTRING_INDEX('%{name}', ' ',-((Length('%{name}')-Length(REPLACE('%{name}', ' ', '')))))) )&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'FilterName'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;CONCAT(firstname,' ',lastname) LIKE '%{name}'&quot;</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'plugin'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'authmysql'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'UpdateName'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;firstname=SUBSTRING_INDEX('%{name}',' ', 1), lastname=IF(Length('%{name}') = Length(REPLACE('%{name}', ' ', '')),'', SUBSTRING_INDEX('%{name}', ' ',-((Length('%{name}')-Length(REPLACE('%{name}', ' ', ''))))))&quot;</span><span class="sy0">;</span></pre> <p> This modifications in the first statement and also in the FilterName join the <code>firstname</code> and the <code>lastname</code> to <code>fullname</code> used by DokuWiki and the second statement splits the given <code>fullname</code> up into two parts: <code>firstname</code> and <code>lastname</code>. This should also work if the last name consists of multiply words like “de la Cruz”. And anyone who registers with a one-word name will have all of it put into the “lastname” field of the database. </p> <p> Please keep in mind that if you set &#039;forwardClearPass = 1&#039; the cleartext password is filled in here. You should at least replace <code>%{pass}</code> with <code>MD5(&#039;%{pass}&#039;)</code> or better set &#039;forwardClearPass = 0&#039; and let DokuWiki do the crypting. I really recommend the second method. </p> <hr /> </div> <div class="secedit editbutton_section editbutton_40"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Store first and last name separated] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="store_first_and_last_name_separated" /><input type="hidden" name="codeblockOffset" value="25" /><input type="hidden" name="range" value="29328-32111" /><button type="submit" title="Store first and last name separated">Edit</button></div></form></div> <h2 class="sectionedit41" id="issues">Issues</h2> <div class="level2"> <p> For reporting issues about this AuthMySQL plugin, please refer to <a href="https://github.com/dokuwiki/dokuwiki/issues" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/issues">https://github.com/dokuwiki/dokuwiki/issues</a>. </p> </div> <div class="secedit editbutton_section editbutton_41"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Issues] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="issues" /><input type="hidden" name="codeblockOffset" value="27" /><input type="hidden" name="range" value="32112-32242" /><button type="submit" title="Issues">Edit</button></div></form></div> <h2 class="sectionedit42" id="php_7_mysqli">PHP 7 &amp; MYSQLI</h2> <div class="level2"> <p> Unfortunately this plugin does not work with PHP7, which has deprecated all the <strong>MYSQL_ </strong> functions. The current mysqlauth plugin does not match <a href="/auth:mysql#using_php_mysqli_library" class="wikilink2" title="auth:mysql" rel="nofollow" data-wiki-id="auth:mysql">the fixes suggested</a> by Jacket. It&#039;s largely the same, but there was one line that was still killing the operation with PHP7. </p> <p> Here&#039;s the stock authmysql file, updated to mysqli: <a href="https://nfgworld.com/files/authmysql.zip" class="urlextern" title="https://nfgworld.com/files/authmysql.zip">authmysql.zip</a>. Almost all of the fixes were as described in Jacket&#039;s patch file, but for one function (below). The commented out line was the original, but it seemed to be checking something that didn&#039;t need to be checked, and it caused an error 500, so I simply removed it. The empty lines are where its error result code went. </p> <p> It&#039;s probably a dangerous chunk of code, so you shouldn&#039;t use it, but I use it and it seems fine. Be careful. <img src="/lib/images/smileys/smile2.svg" class="icon smiley" alt="=)" /> </p> <pre class="code php"> <span class="kw2">protected</span> <span class="kw2">function</span> _openDB<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dbcon</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$con</span> <span class="sy0">=</span> <a href="http://www.php.net/mysqli_connect"><span class="kw3">mysqli_connect</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getConf</span><span class="br0">&#40;</span><span class="st_h">'server'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getConf</span><span class="br0">&#40;</span><span class="st_h">'user'</span><span class="br0">&#41;</span><span class="sy0">,</span> conf_decodeString<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getConf</span><span class="br0">&#40;</span><span class="st_h">'password'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$t</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$con</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// if((if (mysqli_connect_errno()) mysqli_select_db($this-&gt;getConf('database'), $con))) {</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span><a href="http://www.php.net/preg_match"><span class="kw3">preg_match</span></a><span class="br0">&#40;</span><span class="st_h">'/^(\d+)\.(\d+)\.(\d+).*/'</span><span class="sy0">,</span> <a href="http://www.php.net/mysqli_get_server_info"><span class="kw3">mysqli_get_server_info</span></a><span class="br0">&#40;</span><span class="re0">$con</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$result</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dbver</span> <span class="sy0">=</span> <span class="re0">$result</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dbrev</span> <span class="sy0">=</span> <span class="re0">$result</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dbsub</span> <span class="sy0">=</span> <span class="re0">$result</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dbcon</span> <span class="sy0">=</span> <span class="re0">$con</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getConf</span><span class="br0">&#40;</span><span class="st_h">'charset'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <a href="http://www.php.net/mysqli_query"><span class="kw3">mysqli_query</span></a><span class="br0">&#40;</span><span class="st_h">'SET CHARACTER SET &quot;'</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getConf</span><span class="br0">&#40;</span><span class="st_h">'charset'</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'&quot;'</span><span class="sy0">,</span> <span class="re0">$con</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="kw1">return</span> <span class="kw4">true</span><span class="sy0">;</span> <span class="co1">// connection and database successfully opened</span> &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_debug<span class="br0">&#40;</span> <span class="st0">&quot;MySQL err: Connection to {<span class="es4">$this-&gt;getConf</span>('user')}@{<span class="es4">$this-&gt;getConf</span>('server')} not possible.&quot;</span><span class="sy0">,</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">,</span> <span class="kw4">__LINE__</span><span class="sy0">,</span> <span class="kw4">__FILE__</span> <span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> &nbsp; <span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span> <span class="co1">// connection failed</span> <span class="br0">&#125;</span> <span class="kw1">return</span> <span class="kw4">true</span><span class="sy0">;</span> <span class="co1">// connection already open</span> <span class="br0">&#125;</span></pre> <p> — <a href="https://forum.dokuwiki.org/u/NFG" class="interwiki iw_user" title="https://forum.dokuwiki.org/u/NFG">NFG</a> <em>2018-03-16 01:40</em> </p> </div> <div class="secedit editbutton_section editbutton_42"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[PHP 7 &amp; MYSQLI] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="php_7_mysqli" /><input type="hidden" name="codeblockOffset" value="27" /><input type="hidden" name="range" value="32243-34456" /><button type="submit" title="PHP 7 &amp; MYSQLI">Edit</button></div></form></div> <h2 class="sectionedit43" id="discussion">Discussion</h2> <div class="level2"> <p> <strong>Wishlist</strong> </p> <ul> <li class="level1"><div class="li"> It would be useful to have a tutorial and example script to import the users from file <code>users.auth.php</code> to MySQL tables.</div> </li> </ul> <p> In the SQL snippets above I can&#039;t find the handling of the <code>usergroup</code> table&#039;s fields in case of adding/deleting records to/from the respective master table: The <code>addUserGroup</code> and <code>delUserGroup</code> statements are separated and since there are neither transactions nor FK constraints involved the whole construct is <em>not safe</em>. While this could be left to the DBMS (provided that you&#039;re using <code>InnoDB</code> tables with the correct FK/DELETE/UPDATE constraints, which would obsolete as well application level table locking and for example <code>delUserGroup</code>), here (i.e. when using <code>MyISAM</code>) you have to do this on application level. </p> <blockquote><div class="no"> Table usergroup is handled by addUserGroup and delUserGroup. Multi-statement commands will be protected by table locks. This backend must also work with MySQL 3.23 and because neither transaction are well supported nor innoDB work without a lot of tweaking in 3.23, transactions aren&#039;t used here. This may change in future.<br/> — <em><a href="mailto:matthiasgrimm%20%5Bat%5D%20users%20%5Bdot%5D%20sourceforge%20%5Bdot%5D%20net" class="mail" title="matthiasgrimm [at] users [dot] sourceforge [dot] net">Matthias Grimm</a> 2006-01-31 19:44</em></div></blockquote> <p> Hence you should either make sure that there&#039;s no way to add/remove records to/from the <code>users</code> / <code>groups</code> tables without updating the <code>usergroup</code> table appropriately or consequently use the DBMS features provided by the <code>InnoDB</code> table type as mentioned above. In any case, however, whatever you choose, <em>always</em> specify the table type you want to use! <br/> <em>– 2005-12-04 <a href="mailto:mailto%3Asupport%20%5Bat%5D%20mwat%20%5Bdot%5D%20de" class="mail" title="mailto:support [at] mwat [dot] de">Matthias Watermann</a></em> </p> </div> <h5 id="mysql_trace_mode_warning">MySQL Trace Mode warning</h5> <div class="level5"> <p> If you have trace_mode on in you MySQL config, you may find that even if all your queries are OK, usermanager still reports “Found 0 users”. To fix this find a way to turn off mysql_trace_mode like <a href="http://stackoverflow.com/questions/674061/sql-calc-found-rows-found-rows-does-not-work-in-php" class="urlextern" title="http://stackoverflow.com/questions/674061/sql-calc-found-rows-found-rows-does-not-work-in-php">This one</a>. </p> <p> Apparently the default setting for this has changed since MySQL version 5.2.6 from off to on. </p> <p> If you don&#039;t want, or can&#039;t change mysql_trace_mode, there is another fix. Open the file WIKIPATH/inc/auth/mysql.class.php, find “function getUserCount($filter=array()) {” (must be line 309). Replace the whole getUserCount() function with this: </p> <pre class="code php"> <span class="kw2">function</span> getUserCount<span class="br0">&#40;</span><span class="re0">$filter</span><span class="sy0">=</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$rc</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_openDB<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$sql</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_createSQLFilter<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">cnf</span><span class="br0">&#91;</span><span class="st_h">'getUsers'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$filter</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dbver</span> <span class="sy0">&gt;=</span> <span class="nu0">4</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$sql</span> <span class="sy0">=</span> <a href="http://www.php.net/substr"><span class="kw3">substr</span></a><span class="br0">&#40;</span><span class="re0">$sql</span><span class="sy0">,</span> <a href="http://www.php.net/strpos"><span class="kw3">strpos</span></a><span class="br0">&#40;</span><a href="http://www.php.net/strtolower"><span class="kw3">strtolower</span></a><span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="st0">&quot;from&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="coMULTI">/* remove everytnig between 'FROM' */</span> <span class="re0">$sql</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT COUNT(*) &quot;</span><span class="sy0">.</span><span class="re0">$sql</span><span class="sy0">.</span><span class="st0">&quot; LIMIT 1&quot;</span><span class="sy0">;</span> <span class="re0">$result</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_queryDB<span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="re0">$rc</span> <span class="sy0">=</span> <span class="re0">$result</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'COUNT(*)'</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$result</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_queryDB<span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$rc</span> <span class="sy0">=</span> <a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span>_closeDB<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="kw1">return</span> <span class="re0">$rc</span><span class="sy0">;</span> <span class="br0">&#125;</span></pre> <p> Hope this will save someone the hours I spend investigating. </p> <p> — <em><a href="mailto:jacket%20%5Bat%5D%20megalan%20%5Bdot%5D%20bg" class="mail" title="jacket [at] megalan [dot] bg">Jacket</a> 2010/02/10 12:41</em> </p> </div> <div class="secedit editbutton_section editbutton_43"><form class="button btn_secedit" method="post" action="/plugin:authmysql"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1707602292" /><input type="hidden" name="summary" value="[Discussion] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="discussion" /><input type="hidden" name="codeblockOffset" value="28" /><input type="hidden" name="range" value="34457-" /><button type="submit" title="Discussion">Edit</button></div></form></div> <!-- wikipage stop --> </div> <div class="docInfo"><bdi>plugin/authmysql.txt</bdi> · Last modified: <time datetime="2024-02-10T22:58:12+0100">2024-02-10 22:58</time> by <bdi>Klap-in</bdi></div> <hr class="a11y" /> </div></main><!-- /content --> <!-- PAGE ACTIONS --> <nav id="dokuwiki__pagetools" aria-labelledby="dokuwiki__pagetools__heading"> <h3 class="a11y" id="dokuwiki__pagetools__heading">Page Tools</h3> <div class="tools"> <ul> <li class="edit"><a href="/plugin:authmysql?do=edit" title="Edit this page [e]" rel="nofollow" accesskey="e"><span>Edit this page</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg></a></li><li class="revs"><a href="/plugin:authmysql?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o"><span>Old revisions</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg></a></li><li class="backlink"><a href="/plugin:authmysql?do=backlink" title="Backlinks" rel="nofollow"><span>Backlinks</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg></a></li><li class="top"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t"><span>Back to top</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg></a></li> </ul> </div> </nav> </div><!-- /wrapper --> <!-- ********** FOOTER ********** --> <footer id="dokuwiki__footer"><div class="pad"> <div class="license">Except where otherwise noted, content on this wiki is licensed under the following license: <bdi><a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license" class="urlextern">CC Attribution-Share Alike 4.0 International</a></bdi></div> <div class="buttons"> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license"><img src="/lib/images/license/button/cc-by-sa.png" alt="CC Attribution-Share Alike 4.0 International" /></a> <a href="https://www.dokuwiki.org/donate" title="Donate" ><img src="/lib/tpl/dokuwiki/images/button-donate.gif" width="80" height="15" alt="Donate" /></a> <a href="https://php.net" title="Powered by PHP" ><img src="/lib/tpl/dokuwiki/images/button-php.gif" width="80" height="15" alt="Powered by PHP" /></a> <a href="//validator.w3.org/check/referer" title="Valid HTML5" ><img src="/lib/tpl/dokuwiki/images/button-html5.png" width="80" height="15" alt="Valid HTML5" /></a> <a href="//jigsaw.w3.org/css-validator/check/referer?profile=css3" title="Valid CSS" ><img src="/lib/tpl/dokuwiki/images/button-css.png" width="80" height="15" alt="Valid CSS" /></a> <a href="https://dokuwiki.org/" title="Driven by DokuWiki" ><img src="/lib/tpl/dokuwiki/images/button-dw.png" width="80" height="15" alt="Driven by DokuWiki" /></a> </div> <div style="margin-top: 2em; font-size:90%" class="dokuwiki"><div style="float:right"><a href="http://www.splitbrain.org/personal#imprint" style="float:right; text-decoration: none; color:#333">Imprint</a></div></div><!-- Include for DokuWiki site wide top bar --> <style type="text/css"> @media screen { body { padding-top: 30px; } #global__header { position: absolute; top: 0; left: 0; text-align: left; vertical-align: middle; line-height: 1.5; background-color: #333; box-shadow: 0 0 8px rgba(0,0,0,0.5); width: 100%; margin: 0; padding: 5px 20px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; white-space: nowrap; overflow: hidden; } #global__header h2 { position: absolute; left: -99999em; top: 0; overflow: hidden; display: inline; } #global__header ul, #global__header li { margin: 0; padding: 0; list-style: none; display: inline; line-height: 1.5; } #global__header a { color: #bbb; text-decoration: none; margin-right: 20px; font-size: 14px; font-weight: normal; } #global__header a:hover, #global__header a:active, #global__header a:focus { color: #fff; text-decoration: underline; } #global__header form { float: right; margin: 0 0 0 20px; } #global__header input { background-color: #333; background-image: none; border: 1px solid #bbb; color: #fff; box-shadow: none; border-radius: 2px; margin: 0; line-height: normal; padding: 1px 0 1px 0; height: auto; } #global__header input.button { border: none; color: #bbb; } #global__header input.button:hover, #global__header input.button:active, #global__header input.button:focus { color: #fff; text-decoration: underline; } } /* /@media */ @media only screen and (min-width: 601px) { /* changes specific for www.dokuwiki.org */ #dokuwiki__header { padding-top: 3em; } #dokuwiki__usertools { top: 3em; } /* changes specific for bugs.dokuwiki.org */ div#container div#showtask { top: 40px; } } /* /@media */ @media only screen and (max-width: 600px) { body { padding-top: 0; } #global__header { position: static; white-space: normal; overflow: auto; } #global__header form { float: none; display: block; margin: 0 0 .4em; } } /* /@media */ @media print { #global__header { display: none; } } /* /@media */ </style> <div id="global__header"> <h2>Global DokuWiki Links</h2> <form method="get" action="https://search.dokuwiki.org/" target="_top"> <input type="text" name="q" title="Search all DokuWiki sites at once" class="input" /> <input type="submit" title="Search all DokuWiki sites at once" value="Search" class="button" /> </form> <ul> <li><a href="https://download.dokuwiki.org" title="Download the latest release" target="_top">Download</a></li> <li><a href="https://www.dokuwiki.org" title="Read the DokuWiki documentation" target="_top">Wiki</a></li> <li><a href="https://forum.dokuwiki.org" title="Ask questions in the DokuWiki forum" target="_top">Forum</a></li> <li><a href="https://irc.dokuwiki.org" title="Check IRC chat logs or join the chat" target="_top">IRC</a></li> <li><a href="https://github.com/splitbrain/dokuwiki/issues" title="Report and track bugs" target="_top">Bugs</a></li> <li><a href="https://translate.dokuwiki.org/" title="Help translating the DokuWiki interface" target="_top">Translate</a></li> <li><a href="https://github.com/splitbrain/dokuwiki" title="Access the most recent git commits" target="_top">Git</a></li> <li><a href="https://xref.dokuwiki.org/reference/dokuwiki/" title="Cross-Reference of the DokuWiki source code" target="_top">XRef</a></li> <li><a href="https://codesearch.dokuwiki.org/" title="Search through the sources of DokuWiki, plugins and templates" target="_top">Code Search</a></li> </ul> </div> <!-- end of DokuWiki top bar include --> </div></footer><!-- /footer --> </div></div><!-- /site --> <div class="no"><img src="/lib/exe/taskrunner.php?id=plugin%3Aauthmysql&amp;1742430839" width="2" height="1" alt="" /></div> <div id="screen__mode" class="no"></div></body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10