AuthController.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <?php
  2. /*
  3. * This file is part of the Jiannei/lumen-api-starter.
  4. *
  5. * (c) Jiannei <longjian.huang@foxmail.com>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace App\Http\Controllers\Admin\Base;
  11. use App\Http\Controllers\Controller;
  12. use App\Http\Middleware\SingleLoginLimit;
  13. use App\Mail\NoticeMail;
  14. use App\Repositories\Enums\Base\AdminTypeEnum;
  15. use App\Repositories\Enums\ModelStatusEnum;
  16. use App\Repositories\Enums\ResponseCodeEnum;
  17. use App\Repositories\Models\Base\Admin;
  18. use App\Repositories\Transformers\Base\AdminTransformer;
  19. use App\Support\Traits\LoginLimit;
  20. use Carbon\Carbon;
  21. use Illuminate\Http\Request;
  22. use Illuminate\Support\Facades\Cache;
  23. use Illuminate\Support\Facades\Hash;
  24. use Illuminate\Support\Facades\Mail;
  25. use Jiannei\Response\Laravel\Support\Facades\Response;
  26. class AuthController extends Controller
  27. {
  28. use LoginLimit;
  29. /**
  30. * Create a new controller instance.
  31. */
  32. public function __construct()
  33. {
  34. $this->middleware('throttle:10,1', ['only' => ['login']]);
  35. }
  36. /**
  37. * 登录
  38. * Author: Mead
  39. */
  40. public function login(Request $request)
  41. {
  42. $this->validate($request, [
  43. 'username' => 'required',
  44. 'password' => 'required|min:6'
  45. ]);
  46. $credentials = request(['username', 'password']);
  47. $credentials['password'] = base64_decode($credentials['password']);
  48. $credentials['status'] = ModelStatusEnum::OK;
  49. $credentials['type'] = AdminTypeEnum::ADMIN;
  50. $username = $credentials['username'];
  51. $msg = $this->isCanLogin($request, $username, 'admins');
  52. if ($msg) {
  53. return Response::fail($msg, ResponseCodeEnum::SERVICE_LOGIN_ERROR);
  54. }
  55. if (!$token = auth()->guard('admins')->attempt($credentials)) {
  56. $this->storeLoginLog($request, $username, 'admins');
  57. return Response::fail('账号或密码不对!', ResponseCodeEnum::SERVICE_LOGIN_ERROR);
  58. }
  59. $user = auth('admins')->user();
  60. $this->clearLoginLogs($request, $username, 'admins');
  61. SingleLoginLimit::setToken('admins', $user->id, $token);
  62. $user = (new AdminTransformer())->transform($user);
  63. $permissions = login_admin()->getAllPermissions()->pluck('name');
  64. return Response::success(compact('token', 'user', 'permissions'));
  65. }
  66. /**
  67. * 退出
  68. * @return mixed
  69. * Author: Mead
  70. */
  71. public function logout()
  72. {
  73. auth('admins')->logout();
  74. return Response::noContent();
  75. }
  76. /**
  77. * 用户
  78. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
  79. * Author: Mead
  80. */
  81. public function me()
  82. {
  83. $me = (new AdminTransformer())->transform(Admin::query()->find(login_admin_id()));
  84. return Response::success($me);
  85. }
  86. /**
  87. * 更新用户信息
  88. * @param Request $request
  89. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  90. * @throws \Illuminate\Validation\ValidationException
  91. * Author: Mead
  92. */
  93. public function update(Request $request)
  94. {
  95. $this->validate($request, [
  96. // 'username' => 'required|min:6',
  97. 'name' => 'required',
  98. 'password' => 'sometimes|confirmed',
  99. // 'headimg' => 'sometimes',
  100. // 'department_id' => 'required',
  101. 'mobile' => 'required|mobile',
  102. 'email' => 'required|email',
  103. // 'status' => 'required',
  104. ]);
  105. try {
  106. $data = $request->only(['name', 'password', 'mobile', 'email', 'department_id']);
  107. if (isset($data['password']) && $data['password']) {
  108. $data['password'] = Hash::make($data['password']);
  109. } else {
  110. unset($data['password']);
  111. }
  112. $re = Admin::query()->where('id', login_admin_id())->update($data);
  113. if ($re) {
  114. return Response::success(null);
  115. }
  116. return $this->errorFail();
  117. } catch (\Exception $e) {
  118. $this->error($e);
  119. }
  120. }
  121. /**
  122. * 找回密码,发送验证码
  123. * Author: Mead
  124. */
  125. public function sendValidationCode(Request $request)
  126. {
  127. $this->validate($request, [
  128. 'username' => 'required|min:5'
  129. ]);
  130. $username = $request->get('username');
  131. $admin = Admin::query()->where('username', $username)->first();
  132. if (!$admin) {
  133. return Response::fail('找不到该账号');
  134. }
  135. if (empty($admin->email)) {
  136. return Response::fail('该账号邮箱为空,请联系管理员重置密码!');
  137. }
  138. $code = rand(1000, 9000);
  139. Cache::put('sendValidationCode:username:' . $username, $code, Carbon::now()->addMinutes(5));
  140. Mail::to($admin->email)->send(new NoticeMail('找回密码-' . config('app.name'), "您正在找回登录密码,验证码:{$code},如非本人操作,请注意账号安全。"));
  141. return Response::success(null);
  142. }
  143. /**
  144. * 重置密码
  145. * @param Request $request
  146. * Author: Mead
  147. */
  148. public function retrievePassword(Request $request)
  149. {
  150. $this->validate($request, [
  151. 'username' => 'required|min:5',
  152. 'code' => 'required|size:4',
  153. 'password' => 'required|min:6|confirmed',
  154. ]);
  155. if ($password = $request->get('password')) {
  156. if ($msg = check_password($password)) {
  157. return Response::fail($msg);
  158. }
  159. }
  160. $username = $request->get('username');
  161. $code = $request->get('code');
  162. $validation_code = Cache::get('sendValidationCode:username:' . $username);
  163. if ((string)$code !== (string)$validation_code) {
  164. return Response::fail('验证码错误');
  165. }
  166. $admin = Admin::query()->where('username', $username)->first();
  167. if (!$admin) {
  168. return Response::fail('找不到该账号');
  169. }
  170. $admin->password = Hash::make($request->get('password'));
  171. $admin->save();
  172. return Response::success(null);
  173. }
  174. /**
  175. * 查找账号的邮箱
  176. * @param Request $request
  177. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
  178. * @throws \Illuminate\Validation\ValidationException
  179. * Author: Mead
  180. */
  181. public function findEmail(Request $request)
  182. {
  183. $this->validate($request, [
  184. 'username' => 'required|min:5'
  185. ]);
  186. $username = $request->get('username');
  187. $email = Admin::query()->where('username', $username)->value('email');
  188. return Response::success(compact('email'));
  189. }
  190. /**
  191. * 重置密码
  192. * @param Request $request
  193. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  194. * @throws \Illuminate\Validation\ValidationException
  195. * Author: Mead
  196. */
  197. public function resetPassword(Request $request)
  198. {
  199. $this->validate($request, [
  200. 'id' => 'required',
  201. 'password' => 'required|min:6|confirmed',
  202. ]);
  203. $id = $request->get('id');
  204. $admin = Admin::query()->where('id', $id)->first();
  205. if (!$admin) {
  206. return Response::fail('找不到该账号');
  207. }
  208. $admin->password = Hash::make($request->get('password'));
  209. $admin->save();
  210. return Response::success(null);
  211. }
  212. }