AuthController.php 7.3 KB

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