LoginController.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace App\Http\ApiControllers;
  3. use App\User;
  4. use Illuminate\Http\JsonResponse;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\Hash;
  8. class LoginController
  9. {
  10. /**
  11. * @api {post} /login 登录接口
  12. * @apiName login
  13. * @apiGroup User
  14. *
  15. * @apiParam {string} username 用户名
  16. * @apiParam {string} password 用户密码,需要base64加密
  17. *
  18. * @apiSuccess {string} message 响应描述
  19. * @apiSuccess {int} status_code HTTP响应码
  20. * @apiSuccess {string} data.token 认证token
  21. * @apiSuccess {String} data.menu 菜单JSON
  22. *
  23. * @apiSuccessExample {json} Success-Response:
  24. * HTTP/1.1 200 OK
  25. * {
  26. * "message": "请求成功",
  27. * "status_code": "200"
  28. * "data":{
  29. * "toke":"token",
  30. * "menu":"{}",
  31. * }
  32. * }
  33. */
  34. public function login(Request $request):JsonResponse
  35. {
  36. $userName = $request->get('username','');
  37. $password = $request->get('password','');
  38. $users = User::query()->where("name",$userName)->orWhereHas("userDetail",function ($query)use($userName){
  39. $query->where("mobile_phone",$userName);
  40. })->get();
  41. $response = [
  42. 'message' => '请求成功',
  43. 'status_code' => 200,
  44. ];
  45. $user = null;
  46. foreach ($users as $item){
  47. if (Hash::check(base64_decode($password),$item->password)){
  48. $user = $item;
  49. break;
  50. }
  51. }
  52. //验证用户登录
  53. if (!$user){
  54. $response["message"] = "用户名或密码错误";
  55. $response["status_code"] = 410;
  56. return response()->json($response);
  57. }
  58. //获取公私钥
  59. try {
  60. $privateKey = file_get_contents(base_path().'/private.pem');
  61. }catch (\Exception $e){
  62. $response["status_code"] = 410;
  63. if (strpos($e->getMessage(),"No such file or directory")!==false)$response["message"] = "服务器异常,资源丢失";
  64. else $response["message"] = "访问某些资源失败";
  65. return response()->json($response);
  66. }
  67. try {
  68. $token = app("UserService")->getJWTToken($user,$privateKey);
  69. //单点登录标记
  70. app("UserService")->setSingleTag($user->id,$token);
  71. $response["data"] = ["token"=>$token,
  72. "menu"=>$this->getMenu($user),"info"=>["id"=>$user->id,"name"=>$user->name]];
  73. app("UserService")->setOrRefreshCache($user);
  74. return response()->json($response);
  75. }catch (\Exception $e){
  76. $response["status_code"] = 409;
  77. $response["message"] = "资源异常,无法反馈";
  78. return response()->json($response);
  79. }
  80. }
  81. private function getMenu($user)
  82. {
  83. Auth::setUser($user);
  84. $authorities = app("AuthorityService")->getUserAndroidAuthority();
  85. $result = [];
  86. foreach (app("AuthorityService")->format($authorities) as $authority){
  87. foreach ($authority["child"] as $authorityOne){
  88. $item = [];
  89. foreach ($authorityOne["child"] as $authorityTwo){
  90. $item[] = $authorityTwo["name"];
  91. }
  92. $result[$authorityOne["name"]] = $item;
  93. }
  94. }
  95. return json_encode($result,JSON_UNESCAPED_UNICODE);
  96. }
  97. }