From f6c69208a53429a954f1af7d93ea037a454978ff Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 4 May 2015 12:52:10 +0800 Subject: [PATCH] auth mysql --- plugins/emqttd_auth_mysql/.placehodler | 0 plugins/emqttd_auth_mysql/README.md | 21 ++++++++ plugins/emqttd_auth_mysql/rebar.config | 19 +++++++ .../src/emqttd_auth_mysql.app.src | 12 +++++ .../src/emqttd_auth_mysql.erl | 54 +++++++++++++++++++ .../src/emqttd_auth_mysql_app.erl | 19 +++++++ .../src/emqttd_auth_mysql_sup.erl | 27 ++++++++++ 7 files changed, 152 insertions(+) create mode 100644 plugins/emqttd_auth_mysql/.placehodler create mode 100644 plugins/emqttd_auth_mysql/README.md create mode 100644 plugins/emqttd_auth_mysql/rebar.config create mode 100644 plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.app.src create mode 100644 plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.erl create mode 100644 plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_app.erl create mode 100644 plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_sup.erl diff --git a/plugins/emqttd_auth_mysql/.placehodler b/plugins/emqttd_auth_mysql/.placehodler new file mode 100644 index 000000000..e69de29bb diff --git a/plugins/emqttd_auth_mysql/README.md b/plugins/emqttd_auth_mysql/README.md new file mode 100644 index 000000000..d6f783945 --- /dev/null +++ b/plugins/emqttd_auth_mysql/README.md @@ -0,0 +1,21 @@ +## Overview + +Authentication with user table of MySQL database. + +## Demo User Table + +``` +CREATE TABLE `mqtt_users` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(60) DEFAULT NULL, + `password` varchar(60) DEFAULT NULL, + `salt` varchar(20) DEFAULT NULL, + `created` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `mqtt_users_username` (`username`) +) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; +``` + +## Plugin config + + diff --git a/plugins/emqttd_auth_mysql/rebar.config b/plugins/emqttd_auth_mysql/rebar.config new file mode 100644 index 000000000..2e9d5c953 --- /dev/null +++ b/plugins/emqttd_auth_mysql/rebar.config @@ -0,0 +1,19 @@ +%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 ft=erlang et + +{require_min_otp_vsn, "R17"}. + +%% fail_on_warning, +{erl_opts, [debug_info, {parse_transform, lager_transform}]}. + +{erl_opts, [warn_export_all, + warn_unused_import, + {i, "include"}, + {src_dirs, ["src"]}]}. + +{xref_checks, [undefined_function_calls]}. + +{deps, [ + {'Emysql', "*", {git, "git://github.com/Eonblast/Emysql.git", {branch, "master"}}} +]}. + diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.app.src b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.app.src new file mode 100644 index 000000000..9094f9e77 --- /dev/null +++ b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.app.src @@ -0,0 +1,12 @@ +{application, emqttd_auth_mysql, + [ + {description, ""}, + {vsn, "0.1"}, + {registered, []}, + {applications, [ + kernel, + stdlib + ]}, + {mod, {emqttd_auth_mysql_app, []}}, + {env, []} + ]}. diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.erl b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.erl new file mode 100644 index 000000000..a6d5ce5a8 --- /dev/null +++ b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.erl @@ -0,0 +1,54 @@ +%%%----------------------------------------------------------------------------- +%%% Copyright (c) 2012-2015 eMQTT.IO, All Rights Reserved. +%%% +%%% Permission is hereby granted, free of charge, to any person obtaining a copy +%%% of this software and associated documentation files (the "Software"), to deal +%%% in the Software without restriction, including without limitation the rights +%%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%%% copies of the Software, and to permit persons to whom the Software is +%%% furnished to do so, subject to the following conditions: +%%% +%%% The above copyright notice and this permission notice shall be included in all +%%% copies or substantial portions of the Software. +%%% +%%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +%%% SOFTWARE. +%%%----------------------------------------------------------------------------- +%%% @doc +%%% emqttd authentication by mysql user table. +%%% +%%% @end +%%%----------------------------------------------------------------------------- +-module(emqttd_auth_mysql). + +-author("Feng Lee "). + +-include_lib("emqttd/include/emqttd.hrl"). + +-behaviour(emqttd_auth_mod). + +-export([init/1, check/3, description/0]). + +-record(state, {user_tab}). + +init(Opts) -> + UserTab = proplists:get_value(user_table, Opts, mqtt_users), + {ok, #state{user_tab = UserTab}}. + +check(#mqtt_client{username = undefined}, _Password, _State) -> + {error, "Username undefined"}; +check(_Client, undefined, _State) -> + {error, "Password undefined"}; +check(#mqtt_client{username = Username}, Password, #state{user_tab = UserTab}) -> + case emysql:select(UserTab, {{username, Username}, {password, erlang:md5(Password)}}) of + {ok, []} -> {error, "Username or Password not match"}; + {ok, _Record} -> ok + end. + +description() -> "Authentication by MySQL". + diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_app.erl b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_app.erl new file mode 100644 index 000000000..e1f16bf98 --- /dev/null +++ b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_app.erl @@ -0,0 +1,19 @@ +-module(emqttd_auth_mysql_app). + +-behaviour(application). + +%% Application callbacks +-export([start/2, stop/1]). + +%% =================================================================== +%% Application callbacks +%% =================================================================== + +start(_StartType, _StartArgs) -> + {ok, Sup} = emqttd_auth_mysql_sup:start_link(), + emqttd_access_control:register_mod(auth, emqttd_auth_mysql, []), + {ok, Sup}. + +stop(_State) -> + emqttd_access_control:unregister_mod(auth, emqttd_auth_mysql), + ok. diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_sup.erl b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_sup.erl new file mode 100644 index 000000000..f2fc9e0b1 --- /dev/null +++ b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_sup.erl @@ -0,0 +1,27 @@ +-module(emqttd_auth_mysql_sup). + +-behaviour(supervisor). + +%% API +-export([start_link/0]). + +%% Supervisor callbacks +-export([init/1]). + +%% Helper macro for declaring children of supervisor +-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}). + +%% =================================================================== +%% API functions +%% =================================================================== + +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). + +%% =================================================================== +%% Supervisor callbacks +%% =================================================================== + +init([]) -> + {ok, { {one_for_one, 5, 10}, []} }. +