diff --git a/admin/admin/admin.pb.go b/admin/admin/admin.pb.go index 983c958..6d503f1 100644 --- a/admin/admin/admin.pb.go +++ b/admin/admin/admin.pb.go @@ -584,7 +584,7 @@ const file_proto_admin_proto_rawDesc = "" + "\x11AdminLoginRequest\x12\x1a\n" + "\busername\x18\x01 \x01(\tR\busername\x12\x1a\n" + "\bpassword\x18\x02 \x01(\tR\bpassword\"\x13\n" + - "\x11AdminEmptyRequest2\xd7\x05\n" + + "\x11AdminEmptyRequest2\xaa\x06\n" + "\x05Admin\x12V\n" + "\tAdminEdit\x12\x17.admin.AdminEditRequest\x1a\x0f.admin.Response\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/admin/v3/admin/edit\x12W\n" + "\vAdminStatus\x12\x14.admin.StatusRequest\x1a\x0f.admin.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/admin/v3/admin/status\x12X\n" + @@ -595,7 +595,8 @@ const file_proto_admin_proto_rawDesc = "" + "AdminItems\x12\x18.admin.AdminItemsRequest\x1a\x0f.admin.Response\" \x82\xd3\xe4\x93\x02\x1a:\x01*\x12\x15/admin/v3/admin/items\x12S\n" + "\n" + "AdminLogin\x12\x18.admin.AdminLoginRequest\x1a\x0f.admin.Response\"\x1a\x82\xd3\xe4\x93\x02\x14:\x01*\"\x0f/admin/v3/login\x12W\n" + - "\fAdminRefresh\x12\x18.admin.AdminEmptyRequest\x1a\x0f.admin.Response\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/admin/v3/refreshB\tZ\a./adminb\x06proto3" + "\fAdminRefresh\x12\x18.admin.AdminEmptyRequest\x1a\x0f.admin.Response\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/admin/v3/refresh\x12Q\n" + + "\tLoginInfo\x12\x18.admin.AdminEmptyRequest\x1a\x0f.admin.Response\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\"\x0e/admin/v3/infoB\tZ\a./adminb\x06proto3" var ( file_proto_admin_proto_rawDescOnce sync.Once @@ -630,16 +631,18 @@ var file_proto_admin_proto_depIdxs = []int32{ 6, // 5: admin.Admin.AdminItems:input_type -> admin.AdminItemsRequest 7, // 6: admin.Admin.AdminLogin:input_type -> admin.AdminLoginRequest 8, // 7: admin.Admin.AdminRefresh:input_type -> admin.AdminEmptyRequest - 2, // 8: admin.Admin.AdminEdit:output_type -> admin.Response - 2, // 9: admin.Admin.AdminStatus:output_type -> admin.Response - 2, // 10: admin.Admin.Password:output_type -> admin.Response - 2, // 11: admin.Admin.OwnPassword:output_type -> admin.Response - 2, // 12: admin.Admin.AdminInfo:output_type -> admin.Response - 2, // 13: admin.Admin.AdminItems:output_type -> admin.Response - 2, // 14: admin.Admin.AdminLogin:output_type -> admin.Response - 2, // 15: admin.Admin.AdminRefresh:output_type -> admin.Response - 8, // [8:16] is the sub-list for method output_type - 0, // [0:8] is the sub-list for method input_type + 8, // 8: admin.Admin.LoginInfo:input_type -> admin.AdminEmptyRequest + 2, // 9: admin.Admin.AdminEdit:output_type -> admin.Response + 2, // 10: admin.Admin.AdminStatus:output_type -> admin.Response + 2, // 11: admin.Admin.Password:output_type -> admin.Response + 2, // 12: admin.Admin.OwnPassword:output_type -> admin.Response + 2, // 13: admin.Admin.AdminInfo:output_type -> admin.Response + 2, // 14: admin.Admin.AdminItems:output_type -> admin.Response + 2, // 15: admin.Admin.AdminLogin:output_type -> admin.Response + 2, // 16: admin.Admin.AdminRefresh:output_type -> admin.Response + 2, // 17: admin.Admin.LoginInfo:output_type -> admin.Response + 9, // [9:18] is the sub-list for method output_type + 0, // [0:9] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/admin/admin/admin_grpc.pb.go b/admin/admin/admin_grpc.pb.go index fbc85f8..0aab2b9 100644 --- a/admin/admin/admin_grpc.pb.go +++ b/admin/admin/admin_grpc.pb.go @@ -27,6 +27,7 @@ const ( Admin_AdminItems_FullMethodName = "/admin.Admin/AdminItems" Admin_AdminLogin_FullMethodName = "/admin.Admin/AdminLogin" Admin_AdminRefresh_FullMethodName = "/admin.Admin/AdminRefresh" + Admin_LoginInfo_FullMethodName = "/admin.Admin/LoginInfo" ) // AdminClient is the client API for Admin service. @@ -41,6 +42,7 @@ type AdminClient interface { AdminItems(ctx context.Context, in *AdminItemsRequest, opts ...grpc.CallOption) (*Response, error) AdminLogin(ctx context.Context, in *AdminLoginRequest, opts ...grpc.CallOption) (*Response, error) AdminRefresh(ctx context.Context, in *AdminEmptyRequest, opts ...grpc.CallOption) (*Response, error) + LoginInfo(ctx context.Context, in *AdminEmptyRequest, opts ...grpc.CallOption) (*Response, error) } type adminClient struct { @@ -131,6 +133,16 @@ func (c *adminClient) AdminRefresh(ctx context.Context, in *AdminEmptyRequest, o return out, nil } +func (c *adminClient) LoginInfo(ctx context.Context, in *AdminEmptyRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Admin_LoginInfo_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // AdminServer is the server API for Admin service. // All implementations must embed UnimplementedAdminServer // for forward compatibility. @@ -143,6 +155,7 @@ type AdminServer interface { AdminItems(context.Context, *AdminItemsRequest) (*Response, error) AdminLogin(context.Context, *AdminLoginRequest) (*Response, error) AdminRefresh(context.Context, *AdminEmptyRequest) (*Response, error) + LoginInfo(context.Context, *AdminEmptyRequest) (*Response, error) mustEmbedUnimplementedAdminServer() } @@ -177,6 +190,9 @@ func (UnimplementedAdminServer) AdminLogin(context.Context, *AdminLoginRequest) func (UnimplementedAdminServer) AdminRefresh(context.Context, *AdminEmptyRequest) (*Response, error) { return nil, status.Error(codes.Unimplemented, "method AdminRefresh not implemented") } +func (UnimplementedAdminServer) LoginInfo(context.Context, *AdminEmptyRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method LoginInfo not implemented") +} func (UnimplementedAdminServer) mustEmbedUnimplementedAdminServer() {} func (UnimplementedAdminServer) testEmbeddedByValue() {} @@ -342,6 +358,24 @@ func _Admin_AdminRefresh_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _Admin_LoginInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AdminEmptyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServer).LoginInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Admin_LoginInfo_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServer).LoginInfo(ctx, req.(*AdminEmptyRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Admin_ServiceDesc is the grpc.ServiceDesc for Admin service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -381,6 +415,10 @@ var Admin_ServiceDesc = grpc.ServiceDesc{ MethodName: "AdminRefresh", Handler: _Admin_AdminRefresh_Handler, }, + { + MethodName: "LoginInfo", + Handler: _Admin_LoginInfo_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "proto/admin.proto", diff --git a/admin/adminclient/admin.go b/admin/adminclient/admin.go index c55693a..ac0429d 100644 --- a/admin/adminclient/admin.go +++ b/admin/adminclient/admin.go @@ -33,6 +33,7 @@ type ( AdminItems(ctx context.Context, in *AdminItemsRequest, opts ...grpc.CallOption) (*Response, error) AdminLogin(ctx context.Context, in *AdminLoginRequest, opts ...grpc.CallOption) (*Response, error) AdminRefresh(ctx context.Context, in *AdminEmptyRequest, opts ...grpc.CallOption) (*Response, error) + LoginInfo(ctx context.Context, in *AdminEmptyRequest, opts ...grpc.CallOption) (*Response, error) } defaultAdmin struct { @@ -85,3 +86,8 @@ func (m *defaultAdmin) AdminRefresh(ctx context.Context, in *AdminEmptyRequest, client := admin.NewAdminClient(m.cli.Conn()) return client.AdminRefresh(ctx, in, opts...) } + +func (m *defaultAdmin) LoginInfo(ctx context.Context, in *AdminEmptyRequest, opts ...grpc.CallOption) (*Response, error) { + client := admin.NewAdminClient(m.cli.Conn()) + return client.LoginInfo(ctx, in, opts...) +} diff --git a/admin/internal/logic/adminrefreshlogic.go b/admin/internal/logic/adminrefreshlogic.go index 0dec869..88bdf82 100644 --- a/admin/internal/logic/adminrefreshlogic.go +++ b/admin/internal/logic/adminrefreshlogic.go @@ -69,6 +69,8 @@ func (l *AdminRefreshLogic) AdminRefresh(in *admin.AdminEmptyRequest) (*admin.Re Token: utils.MD5Encrypt(id + utils.Now().String()), } retData.Refresh = utils.MD5Encrypt(id + retData.Token) + //var info dao.JwtInfo + //_ = jsoniter.Unmarshal(LoginInfo.Info, &info) redisKey := utils.GetLoginKey(utils.LoginTypeAdmin, retData.Token) redis.Client.Set(ctx, redisKey, LoginInfo.Info, expire).Result() diff --git a/admin/internal/logic/logininfologic.go b/admin/internal/logic/logininfologic.go new file mode 100644 index 0000000..a4bcd42 --- /dev/null +++ b/admin/internal/logic/logininfologic.go @@ -0,0 +1,65 @@ +package logic + +import ( + "admin/internal/dao" + "admin/internal/model" + "context" + "strconv" + "strings" + + "admin/admin" + "admin/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" + "pkg.local/modelbase" + "pkg.local/utils" +) + +type LoginInfoLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewLoginInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginInfoLogic { + return &LoginInfoLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *LoginInfoLogic) LoginInfo(in *admin.AdminEmptyRequest) (*admin.Response, error) { + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo), nil + } + info := dao.AdminInfo{} + modelObj := model.AdminModel{}.Init() + w := modelbase.Params{Eq: map[string]string{"id": strconv.Itoa(int(adminInfo.ID))}} + err := modelObj.GetOne(w, &info) + if err != nil { + + } + if info.Id > utils.NumberZero { + mobile, dErr := utils.DecryptPhone(info.Phone) + if dErr == nil { + info.Phone = mobile + } + } + + var roles []int + if len(roles) > utils.NumberZero { + for _, role := range strings.Split(info.Roles, utils.DecollatorComma) { + r, _ := strconv.Atoi(role) + roles = append(roles, r) + } + } + retData := dao.AdminInfoRet{ + AdminInfo: info, + Roles: roles, + } + + return l.ok(retData), nil +} diff --git a/admin/internal/logic/ownpasswordlogic.go b/admin/internal/logic/ownpasswordlogic.go index 57c4278..24953b0 100644 --- a/admin/internal/logic/ownpasswordlogic.go +++ b/admin/internal/logic/ownpasswordlogic.go @@ -11,7 +11,6 @@ import ( "admin/internal/svc" "github.com/zeromicro/go-zero/core/logx" - "google.golang.org/grpc/metadata" "pkg.local/modelbase" "pkg.local/utils" ) @@ -37,13 +36,10 @@ func (l *OwnPasswordLogic) OwnPassword(in *admin.OwnPasswordRequest) (*admin.Res return fail, nil } var info dao.AdminPassword - md, exist := metadata.FromIncomingContext(l.ctx) - l.Logger.Info("收到完整metadata", exist, md) adminInfo := utils.GetUserFromCtx(l.ctx) if adminInfo.ID < utils.NumberOne { return l.fail(utils.ErrorNoLoginInfo), nil } - l.Logger.Info("解析出用户信息", adminInfo.ID, adminInfo.Name) w := modelbase.Params{Eq: map[string]string{"id": strconv.Itoa(int(adminInfo.ID))}} modelObj := model.AdminModel{}.Init() err := modelObj.GetOne(w, &info) diff --git a/admin/internal/server/adminserver.go b/admin/internal/server/adminserver.go index f881fd9..832a393 100644 --- a/admin/internal/server/adminserver.go +++ b/admin/internal/server/adminserver.go @@ -62,3 +62,8 @@ func (s *AdminServer) AdminRefresh(ctx context.Context, in *admin.AdminEmptyRequ l := logic.NewAdminRefreshLogic(ctx, s.svcCtx) return l.AdminRefresh(in) } + +func (s *AdminServer) LoginInfo(ctx context.Context, in *admin.AdminEmptyRequest) (*admin.Response, error) { + l := logic.NewLoginInfoLogic(ctx, s.svcCtx) + return l.LoginInfo(in) +} diff --git a/admin/proto/admin.proto b/admin/proto/admin.proto index 9c69f9f..283de22 100644 --- a/admin/proto/admin.proto +++ b/admin/proto/admin.proto @@ -107,4 +107,10 @@ service Admin { body: "*" }; }; + rpc LoginInfo(AdminEmptyRequest) returns(Response){ + option (google.api.http) = { + post: "/admin/v3/info" + body: "*" + }; + }; } \ No newline at end of file diff --git a/bff/etc/admin.pb b/bff/etc/admin.pb index ba1d838..a9d7ac3 100644 Binary files a/bff/etc/admin.pb and b/bff/etc/admin.pb differ diff --git a/deploy/apisix/lua/auth.lua b/deploy/apisix/lua/auth.lua index e4d1d6b..513c8a5 100644 --- a/deploy/apisix/lua/auth.lua +++ b/deploy/apisix/lua/auth.lua @@ -20,7 +20,6 @@ function _M.access(conf, ctx) local service_code = core.request.header(ctx, "authorization-type") local req_auth = core.request.header(ctx, "authorization-auth") local refresh = core.request.header(ctx, "refresh") - core.log.info("RAW_HEADER_DEBUG: refresh=["..(refresh or "").."], service_code=["..(service_code or "").."], token=["..(user_key or "").."]") local skip_auth = white_list[request_uri] if skip_auth then @@ -29,10 +28,10 @@ function _M.access(conf, ctx) else -- 非白名单完整鉴权逻辑 if not user_key or user_key == "" then - return core.response.exit(401, {code = 10003, message = "未登录"}) + return core.response.exit(200, {code = 10003, message = "未登录"}) end if not service_code or service_code == "" then - return core.response.exit(401, {code = 10003, message = "未登录"}) + return core.response.exit(200, {code = 10003, message = "未登录"}) end local redis_config = core.config.local_conf().redis or {} @@ -47,13 +46,13 @@ function _M.access(conf, ctx) local ok, err = red:connect(redis_host, redis_port) if not ok then red:set_keepalive(10000, 100) - return core.response.exit(500, {code = 10003, message = "系统错误,请稍后重试"}) + return core.response.exit(200, {code = 10003, message = "系统错误,请稍后重试"}) end if redis_password ~= "" then local auth_ok, auth_err = red:auth(redis_password) if not auth_ok then red:set_keepalive(10000, 100) - return core.response.exit(500, {code = 10003, message = "系统错误,请稍后重试"}) + return core.response.exit(200, {code = 10003, message = "系统错误,请稍后重试"}) end end if redis_db > 0 then @@ -63,21 +62,21 @@ function _M.access(conf, ctx) local res, err = red:get(redis_key) red:set_keepalive(10000, 100) if err or res == ngx.null then - return core.response.exit(401, {code = 10003, message = "未登录或登录已过期"}) + return core.response.exit(200, {code = 10003, message = "未登录或登录已过期"}) end local json, decode_err = core.json.decode(res) if not json then - return core.response.exit(500, {code = 10003, message = "数据解析错误"}) + return core.response.exit(200, {code = 10003, message = "数据解析错误"}) end if service_code == "admin1" then if not req_auth or req_auth == "" then - return core.response.exit(403, {code = 10008, message = "没有权限访问该资源"}) + return core.response.exit(200, {code = 10008, message = "没有权限访问该资源"}) end local roles = json.roles or {} local expect_path = roles[req_auth] if not expect_path then - return core.response.exit(403, {code = 10008, message = "没有权限访问该资源"}) + return core.response.exit(200, {code = 10008, message = "没有权限访问该资源"}) end local full_expect_uri = "/" .. expect_path local match = false @@ -88,7 +87,7 @@ function _M.access(conf, ctx) end end if request_uri ~= full_expect_uri and not match then - return core.response.exit(403, {code = 10008, message = "没有权限访问该资源"}) + return core.response.exit(200, {code = 10008, message = "没有权限访问该资源"}) end end diff --git a/pkg/utils/status.go b/pkg/utils/status.go index 195dd2a..82e8fa9 100644 --- a/pkg/utils/status.go +++ b/pkg/utils/status.go @@ -8,9 +8,9 @@ type Status struct { } type LoginRedis struct { - Info interface{} `json:"info"` - Token string `json:"token"` - Refresh string `json:"refresh"` + Info []byte `json:"info"` + Token string `json:"token"` + Refresh string `json:"refresh"` } const (