正在显示
31 个修改的文件
包含
396 行增加
和
156 行删除
pkg/application/mobile/auth/command/login.go
0 → 100644
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "errors" | ||
| 5 | + "time" | ||
| 6 | + | ||
| 7 | + "github.com/linmadan/egglib-go/core/application" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/application/factory" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/application/mobile/auth/command" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_user" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +// 组织管理 | ||
| 15 | +type AuthService struct { | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +//AuthLogin 用户登录 | ||
| 19 | +func (srv AuthService) AuthLogin(loginCommand *command.LoginCommand) (interface{}, error) { | ||
| 20 | + var ( | ||
| 21 | + result interface{} | ||
| 22 | + err error | ||
| 23 | + ) | ||
| 24 | + switch loginCommand.GrantType { | ||
| 25 | + case "signInPassword": | ||
| 26 | + result, err = srv.SignInPassword(loginCommand.Phone, loginCommand.Password) | ||
| 27 | + case "signInCaptcha": | ||
| 28 | + default: | ||
| 29 | + err = errors.New("登录方式无法解析") | ||
| 30 | + } | ||
| 31 | + return result, err | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +//SignInPassword 使用账号密码校验 | ||
| 35 | +func (srv AuthService) SignInPassword(account string, password string) (interface{}, error) { | ||
| 36 | + creationUserGateway := allied_creation_user.NewHttplibAlliedCreationUser(0, 0, 0) | ||
| 37 | + _, err := creationUserGateway.AuthCheckPassword(allied_creation_user.ReqAuthCheckPassword{ | ||
| 38 | + Password: password, | ||
| 39 | + Phone: account, | ||
| 40 | + }) | ||
| 41 | + if err != nil { | ||
| 42 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 43 | + } | ||
| 44 | + ltoken := domain.LoginToken{ | ||
| 45 | + UserId: 0, | ||
| 46 | + Account: account, | ||
| 47 | + Platform: domain.LoginPlatformApp, | ||
| 48 | + CompanyId: 0, | ||
| 49 | + } | ||
| 50 | + authcode, err := ltoken.GenerateAuthCode() | ||
| 51 | + if err != nil { | ||
| 52 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 53 | + } | ||
| 54 | + result := map[string]string{ | ||
| 55 | + "authCode": authcode, | ||
| 56 | + } | ||
| 57 | + return result, nil | ||
| 58 | +} | ||
| 59 | + | ||
| 60 | +//SignInCaptcha 使用手机验证码登录 | ||
| 61 | +func (srv AuthService) SignInCaptcha(phone string, captcha string) (interface{}, error) { | ||
| 62 | + return nil, nil | ||
| 63 | +} | ||
| 64 | + | ||
| 65 | +//GetAuthAccessToken 获取令牌Token | ||
| 66 | +func (srv AuthService) GetAuthAccessToken(accessTokenCommand *command.AccessTokenCommand) (interface{}, error) { | ||
| 67 | + ltoken := domain.LoginToken{} | ||
| 68 | + err := ltoken.ParseToken(accessTokenCommand.AuthCode) | ||
| 69 | + if err != nil { | ||
| 70 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 71 | + } | ||
| 72 | + phone := ltoken.Account | ||
| 73 | + creationUserGateway := allied_creation_user.NewHttplibAlliedCreationUser(0, 0, 0) | ||
| 74 | + userSeachResult, err := creationUserGateway.UserSearch(allied_creation_user.ReqUserSearch{ | ||
| 75 | + Phone: phone, | ||
| 76 | + }) | ||
| 77 | + if err != nil { | ||
| 78 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 79 | + } | ||
| 80 | + if len(userSeachResult.Users) == 0 { | ||
| 81 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取用户信息失败") | ||
| 82 | + } | ||
| 83 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 84 | + if err != nil { | ||
| 85 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 86 | + } | ||
| 87 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 88 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 89 | + } | ||
| 90 | + defer func() { | ||
| 91 | + transactionContext.RollbackTransaction() | ||
| 92 | + }() | ||
| 93 | + var loginAccessRepository domain.LoginAccessRepository | ||
| 94 | + if loginAccessRepository, err = factory.CreateLoginAccessRepository(map[string]interface{}{ | ||
| 95 | + "transactionContext": transactionContext, | ||
| 96 | + }); err != nil { | ||
| 97 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 98 | + } | ||
| 99 | + _, lAccess, err := loginAccessRepository.Find(map[string]interface{}{ | ||
| 100 | + "account": phone, | ||
| 101 | + "platform": domain.LoginPlatformApp, | ||
| 102 | + }) | ||
| 103 | + if err != nil { | ||
| 104 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 105 | + } | ||
| 106 | + var currentAccess *domain.LoginAccess | ||
| 107 | + if len(lAccess) > 0 { | ||
| 108 | + currentAccess = lAccess[0] | ||
| 109 | + currentAccess.UpdatedTime = time.Now() | ||
| 110 | + } else { | ||
| 111 | + currentAccess = &domain.LoginAccess{ | ||
| 112 | + UserBaseId: int64(userSeachResult.Users[0].UserBaseId), | ||
| 113 | + UserId: int64(userSeachResult.Users[0].UserId), | ||
| 114 | + Account: userSeachResult.Users[0].UserInfo.Phone, | ||
| 115 | + Platform: domain.LoginPlatformApp, | ||
| 116 | + CompanyId: int64(userSeachResult.Users[0].Company.CompanyId), | ||
| 117 | + OrganizationId: int64(userSeachResult.Users[0].Org.OrgId), | ||
| 118 | + AccessToken: "", | ||
| 119 | + RefreshToken: "", | ||
| 120 | + AccessExpired: 0, | ||
| 121 | + RefreshExpired: 0, | ||
| 122 | + CreatedTime: time.Now(), | ||
| 123 | + UpdatedTime: time.Now(), | ||
| 124 | + } | ||
| 125 | + } | ||
| 126 | + loginToken := domain.LoginToken{ | ||
| 127 | + UserId: currentAccess.UserId, | ||
| 128 | + Account: currentAccess.Account, | ||
| 129 | + CompanyId: currentAccess.CompanyId, | ||
| 130 | + OrgId: currentAccess.OrganizationId, | ||
| 131 | + Platform: currentAccess.Platform, | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + accessTokenStr, err := loginToken.GenerateAccessToken() | ||
| 135 | + if err != nil { | ||
| 136 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 137 | + } | ||
| 138 | + currentAccess.AccessToken = accessTokenStr | ||
| 139 | + currentAccess.AccessExpired = loginToken.ExpiresAt | ||
| 140 | + refreshTokenStr, err := loginToken.GenerateRefreshToken() | ||
| 141 | + if err != nil { | ||
| 142 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 143 | + } | ||
| 144 | + currentAccess.RefreshToken = refreshTokenStr | ||
| 145 | + currentAccess.AccessExpired = loginToken.ExpiresAt | ||
| 146 | + | ||
| 147 | + //先存数据库 | ||
| 148 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 149 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 150 | + } | ||
| 151 | + //先删缓存 | ||
| 152 | + //后加缓存 | ||
| 153 | + return nil, nil | ||
| 154 | +} |
| 1 | -package services | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "fmt" | ||
| 5 | - | ||
| 6 | - "github.com/dgrijalva/jwt-go" | ||
| 7 | - "github.com/sony/sonyflake" | ||
| 8 | -) | ||
| 9 | - | ||
| 10 | -var idwork *sonyflake.Sonyflake | ||
| 11 | - | ||
| 12 | -func init() { | ||
| 13 | - setting := sonyflake.Settings{ | ||
| 14 | - MachineID: func() (uint16, error) { | ||
| 15 | - return 1, nil | ||
| 16 | - }, | ||
| 17 | - CheckMachineID: func(u uint16) bool { | ||
| 18 | - return true | ||
| 19 | - }, | ||
| 20 | - } | ||
| 21 | - idwork = sonyflake.NewSonyflake(setting) | ||
| 22 | -} | ||
| 23 | - | ||
| 24 | -const ( | ||
| 25 | - qrcodeExpires int64 = 3600 //二维码的有效时长,单位:秒 | ||
| 26 | - qrcodeSecret string = "27e6741f0e0b658c" | ||
| 27 | -) | ||
| 28 | - | ||
| 29 | -type qrcodeMessage struct { | ||
| 30 | - Key string `json:"key"` | ||
| 31 | - jwt.StandardClaims | ||
| 32 | -} | ||
| 33 | - | ||
| 34 | -func (msg *qrcodeMessage) GenrateToken() (string, error) { | ||
| 35 | - id, err := idwork.NextID() | ||
| 36 | - if err != nil { | ||
| 37 | - return "", fmt.Errorf("生成二维信息失败:%w", err) | ||
| 38 | - } | ||
| 39 | - msg.Key = fmt.Sprint(id) | ||
| 40 | - //TODO jwt | ||
| 41 | - return "", nil | ||
| 42 | -} | ||
| 43 | - | ||
| 44 | -func (msg *qrcodeMessage) ParseToken(token string) error { | ||
| 45 | - //TODO jwt | ||
| 46 | - return nil | ||
| 47 | -} |
| 1 | -package services | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "bytes" | ||
| 5 | - "context" | ||
| 6 | - "encoding/base64" | ||
| 7 | - "image/png" | ||
| 8 | - | ||
| 9 | - "github.com/boombuler/barcode" | ||
| 10 | - "github.com/boombuler/barcode/qr" | ||
| 11 | -) | ||
| 12 | - | ||
| 13 | -//LoginAccessService 登录功能 | ||
| 14 | -type LoginAccessService struct { | ||
| 15 | -} | ||
| 16 | - | ||
| 17 | -//LoginByAccount 账号登录获取authcode和可选择列表 | ||
| 18 | -func (srv LoginAccessService) LoginByAccount(ctx context.Context) error { | ||
| 19 | - return nil | ||
| 20 | -} | ||
| 21 | - | ||
| 22 | -//LoginBySmsCode 短信验证码登录获取authcode和可选择列表 | ||
| 23 | -func (srv LoginAccessService) LoginBySmsCode(ctx context.Context) error { | ||
| 24 | - return nil | ||
| 25 | -} | ||
| 26 | - | ||
| 27 | -//LoginByAuthCode 使用authCode进行登录获取accessToken和用户权限信息 | ||
| 28 | -func (srv LoginAccessService) LoginInfoByAuthCode(ctx context.Context) error { | ||
| 29 | - return nil | ||
| 30 | -} | ||
| 31 | - | ||
| 32 | -//GetQrcodeLogin 获取用于登录的二维码以及相应的key数据 | ||
| 33 | -func (srv LoginAccessService) GetQrcodeForLogin(ctx context.Context) error { | ||
| 34 | - | ||
| 35 | - qrCode, err := qr.Encode("Hello World", qr.M, qr.Auto) | ||
| 36 | - if err != nil { | ||
| 37 | - return err | ||
| 38 | - } | ||
| 39 | - // Scale the barcode to 200x200 pixels | ||
| 40 | - qrCode, err = barcode.Scale(qrCode, 200, 200) | ||
| 41 | - if err != nil { | ||
| 42 | - return err | ||
| 43 | - } | ||
| 44 | - var imgByte bytes.Buffer | ||
| 45 | - // encode the barcode as png | ||
| 46 | - err = png.Encode(&imgByte, qrCode) | ||
| 47 | - if err != nil { | ||
| 48 | - return err | ||
| 49 | - } | ||
| 50 | - imgBase64 := base64.StdEncoding.EncodeToString(imgByte.Bytes()) | ||
| 51 | - _ = imgBase64 | ||
| 52 | - return err | ||
| 53 | -} | ||
| 54 | - | ||
| 55 | -//ValidLoginForQrcode 检查以扫描二维码方式进行登录的状态 | ||
| 56 | -func (srv LoginAccessService) LoginByScanQrcode(ctx context.Context) error { | ||
| 57 | - return nil | ||
| 58 | -} | ||
| 59 | - | ||
| 60 | -// ValidToken 检查token信息 | ||
| 61 | -func (srv LoginAccessService) ValidAccessToken(ctx context.Context) error { | ||
| 62 | - return nil | ||
| 63 | -} | ||
| 64 | - | ||
| 65 | -// AuthCodeToAccessToken 用authcode交换accessToken | ||
| 66 | -func (srv LoginAccessService) AuthCodeToAccessToken(ctx context.Context) error { | ||
| 67 | - return nil | ||
| 68 | -} |
| @@ -7,5 +7,11 @@ type RoleItem struct { | @@ -7,5 +7,11 @@ type RoleItem struct { | ||
| 7 | RoleName string `json:"roleName"` | 7 | RoleName string `json:"roleName"` |
| 8 | Describe string `json:"describe"` | 8 | Describe string `json:"describe"` |
| 9 | OrgName string `json:"orgName"` | 9 | OrgName string `json:"orgName"` |
| 10 | - RoleType int `json:"roleType"` | 10 | + RoleType int `json:"roleType"` //角色类型 1.普通角色 1024:超级管理员 |
| 11 | +} | ||
| 12 | + | ||
| 13 | +type RoleUser struct { | ||
| 14 | + DepartmentName string `json:"departmentName"` | ||
| 15 | + UserId string `json:"userId"` | ||
| 16 | + UserName string `json:"userName"` | ||
| 11 | } | 17 | } |
| @@ -155,8 +155,8 @@ func (rolesService *RolesService) RoleRemove(roleRemoveCommand *command.RoleRemo | @@ -155,8 +155,8 @@ func (rolesService *RolesService) RoleRemove(roleRemoveCommand *command.RoleRemo | ||
| 155 | roleIds = append(roleIds, int64(id)) | 155 | roleIds = append(roleIds, int64(id)) |
| 156 | } | 156 | } |
| 157 | } | 157 | } |
| 158 | - _, err := creationUserGateway.RoleRemove(allied_creation_user.ReqRoleRemove{ | ||
| 159 | - //TODO 修改 为 切片类型 | 158 | + _, err := creationUserGateway.RoleBatchRemove(allied_creation_user.ReqRoleBatchRemove{ |
| 159 | + RoleIds: roleIds, | ||
| 160 | }) | 160 | }) |
| 161 | if err != nil { | 161 | if err != nil { |
| 162 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 162 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| @@ -126,11 +126,11 @@ func (usersService *UsersService) CompanyUserAdd(companyUserAddCommand *command. | @@ -126,11 +126,11 @@ func (usersService *UsersService) CompanyUserAdd(companyUserAddCommand *command. | ||
| 126 | UserRole: userRole, | 126 | UserRole: userRole, |
| 127 | // 启用状态(启用:1 禁用:2) | 127 | // 启用状态(启用:1 禁用:2) |
| 128 | EnableStatus: companyUserAddCommand.EnableStatus, | 128 | EnableStatus: companyUserAddCommand.EnableStatus, |
| 129 | - Password: "", | ||
| 130 | UserName: companyUserAddCommand.UsersName, | 129 | UserName: companyUserAddCommand.UsersName, |
| 131 | Phone: companyUserAddCommand.Phone, | 130 | Phone: companyUserAddCommand.Phone, |
| 132 | Avatar: companyUserAddCommand.Avator, | 131 | Avatar: companyUserAddCommand.Avator, |
| 133 | Email: companyUserAddCommand.Avator, | 132 | Email: companyUserAddCommand.Avator, |
| 133 | + Password: "", //TODO 填充密码 | ||
| 134 | }) | 134 | }) |
| 135 | 135 | ||
| 136 | data := struct { | 136 | data := struct { |
| @@ -201,7 +201,7 @@ func (usersService *UsersService) CompanyUserResetPassword(companyUserResetPassw | @@ -201,7 +201,7 @@ func (usersService *UsersService) CompanyUserResetPassword(companyUserResetPassw | ||
| 201 | companyUserResetPasswordCommand.Operator.OrgId, | 201 | companyUserResetPasswordCommand.Operator.OrgId, |
| 202 | companyUserResetPasswordCommand.Operator.UserId) | 202 | companyUserResetPasswordCommand.Operator.UserId) |
| 203 | _, err := creationUserGateway.UserBatchResetPassword(allied_creation_user.ReqBatchResetPasswordUser{ | 203 | _, err := creationUserGateway.UserBatchResetPassword(allied_creation_user.ReqBatchResetPasswordUser{ |
| 204 | - Password: "", | 204 | + Password: "", //TODO 填充密码 |
| 205 | UserIds: companyUserResetPasswordCommand.UsersIds, | 205 | UserIds: companyUserResetPasswordCommand.UsersIds, |
| 206 | }) | 206 | }) |
| 207 | return companyUserResetPasswordCommand, err | 207 | return companyUserResetPasswordCommand, err |
| @@ -358,7 +358,7 @@ func (usersService *UsersService) CooperationUserResetPassword(cooperationUserRe | @@ -358,7 +358,7 @@ func (usersService *UsersService) CooperationUserResetPassword(cooperationUserRe | ||
| 358 | cooperationUserResetPasswordCommand.Operator.OrgId, | 358 | cooperationUserResetPasswordCommand.Operator.OrgId, |
| 359 | cooperationUserResetPasswordCommand.Operator.UserId) | 359 | cooperationUserResetPasswordCommand.Operator.UserId) |
| 360 | _, err := creationUserGateway.UserBatchResetPassword(allied_creation_user.ReqBatchResetPasswordUser{ | 360 | _, err := creationUserGateway.UserBatchResetPassword(allied_creation_user.ReqBatchResetPasswordUser{ |
| 361 | - Password: "", | 361 | + Password: "", //TODO 填充密码 |
| 362 | UserIds: cooperationUserResetPasswordCommand.UsersIds, | 362 | UserIds: cooperationUserResetPasswordCommand.UsersIds, |
| 363 | }) | 363 | }) |
| 364 | return cooperationUserResetPasswordCommand, err | 364 | return cooperationUserResetPasswordCommand, err |
| @@ -2,9 +2,17 @@ package domain | @@ -2,9 +2,17 @@ package domain | ||
| 2 | 2 | ||
| 3 | import "time" | 3 | import "time" |
| 4 | 4 | ||
| 5 | +//登录的平台 | ||
| 6 | +const ( | ||
| 7 | + LoginPlatformApp string = "app" | ||
| 8 | + LoginPlatformWeb string = "web" | ||
| 9 | +) | ||
| 10 | + | ||
| 5 | // 登录凭证存储 | 11 | // 登录凭证存储 |
| 6 | type LoginAccess struct { | 12 | type LoginAccess struct { |
| 7 | LoginAccessId int64 `json:"loginAccessId"` | 13 | LoginAccessId int64 `json:"loginAccessId"` |
| 14 | + UserBaseId int64 `json:"userBaseId"` | ||
| 15 | + UserId int64 `json:"userId"` | ||
| 8 | // 账号 | 16 | // 账号 |
| 9 | Account string `json:"account"` | 17 | Account string `json:"account"` |
| 10 | // 对应平台 | 18 | // 对应平台 |
| @@ -17,9 +25,9 @@ type LoginAccess struct { | @@ -17,9 +25,9 @@ type LoginAccess struct { | ||
| 17 | AccessToken string `json:"accessToken"` | 25 | AccessToken string `json:"accessToken"` |
| 18 | // 刷新登录凭证 | 26 | // 刷新登录凭证 |
| 19 | RefreshToken string `json:"refreshToken"` | 27 | RefreshToken string `json:"refreshToken"` |
| 20 | - // 登录凭证过期时间,时间戳精度秒 | 28 | + // 登录凭证到期时间,时间戳精度秒 |
| 21 | AccessExpired int64 `json:"accessExpired"` | 29 | AccessExpired int64 `json:"accessExpired"` |
| 22 | - // 刷新登录凭证过期时间,时间戳精度秒 | 30 | + // 刷新登录凭证到期时间,时间戳精度秒 |
| 23 | RefreshExpired int64 `json:"refreshExpired"` | 31 | RefreshExpired int64 `json:"refreshExpired"` |
| 24 | // 创建时间 | 32 | // 创建时间 |
| 25 | CreatedTime time.Time `json:"createdTime"` | 33 | CreatedTime time.Time `json:"createdTime"` |
| 1 | package domain | 1 | package domain |
| 2 | 2 | ||
| 3 | +import ( | ||
| 4 | + "time" | ||
| 5 | + | ||
| 6 | + jwt "github.com/dgrijalva/jwt-go" | ||
| 7 | +) | ||
| 8 | + | ||
| 3 | const ( | 9 | const ( |
| 4 | - loginTokenSecret string = "bbe35ad433dd8e67" | 10 | + loginTokenSecret string = "bbe35ad433dd8e67" |
| 11 | + accessTokenExpiresAt int64 = 60 * 60 * 2 //两个小时过期 | ||
| 12 | + refreshTokenExpiresAt int64 = 3600 * 24 * 30 * 1 //刷新token 一个月过期 | ||
| 13 | + authCodeExpire int64 = 60 * 15 //15分钟过期 | ||
| 5 | ) | 14 | ) |
| 6 | 15 | ||
| 7 | type LoginToken struct { | 16 | type LoginToken struct { |
| 8 | - UserId int64 `json:"userId"` | ||
| 9 | - UserBaseId int64 `json:"userBaseId"` | 17 | + jwt.StandardClaims |
| 18 | + UserId int64 `json:"userId"` | ||
| 10 | // 账号 | 19 | // 账号 |
| 11 | Account string `json:"account"` | 20 | Account string `json:"account"` |
| 12 | // 对应平台 | 21 | // 对应平台 |
| @@ -14,18 +23,59 @@ type LoginToken struct { | @@ -14,18 +23,59 @@ type LoginToken struct { | ||
| 14 | // 公司id | 23 | // 公司id |
| 15 | CompanyId int64 `json:"companyId"` | 24 | CompanyId int64 `json:"companyId"` |
| 16 | // 组织id | 25 | // 组织id |
| 26 | + OrgId int64 `json:"orgId"` | ||
| 17 | } | 27 | } |
| 18 | 28 | ||
| 19 | -func (t *LoginToken) GenerateAccessToken() error { | ||
| 20 | - | ||
| 21 | - return nil | 29 | +func (t *LoginToken) GenerateAccessToken() (string, error) { |
| 30 | + nowTime := time.Now().Unix() | ||
| 31 | + t.StandardClaims = jwt.StandardClaims{ | ||
| 32 | + NotBefore: nowTime, | ||
| 33 | + IssuedAt: nowTime, | ||
| 34 | + ExpiresAt: nowTime + accessTokenExpiresAt, | ||
| 35 | + Issuer: "allied_creation_gateway", | ||
| 36 | + } | ||
| 37 | + token := jwt.NewWithClaims(jwt.SigningMethodHS256, *t) | ||
| 38 | + return token.SignedString([]byte(loginTokenSecret)) | ||
| 22 | } | 39 | } |
| 23 | 40 | ||
| 24 | -func (t *LoginToken) GenerateRefreshToken() error { | 41 | +func (t *LoginToken) GenerateRefreshToken() (string, error) { |
| 42 | + nowTime := time.Now().Unix() | ||
| 43 | + t.StandardClaims = jwt.StandardClaims{ | ||
| 44 | + NotBefore: nowTime, | ||
| 45 | + IssuedAt: nowTime, | ||
| 46 | + ExpiresAt: nowTime + accessTokenExpiresAt, | ||
| 47 | + Issuer: "allied_creation_gateway", | ||
| 48 | + } | ||
| 49 | + token := jwt.NewWithClaims(jwt.SigningMethodHS256, *t) | ||
| 50 | + return token.SignedString([]byte(loginTokenSecret)) | ||
| 51 | +} | ||
| 25 | 52 | ||
| 26 | - return nil | 53 | +func (t *LoginToken) GenerateAuthCode() (string, error) { |
| 54 | + nowTime := time.Now().Unix() | ||
| 55 | + claims := LoginToken{ | ||
| 56 | + StandardClaims: jwt.StandardClaims{ | ||
| 57 | + NotBefore: nowTime, | ||
| 58 | + IssuedAt: nowTime, | ||
| 59 | + ExpiresAt: nowTime + authCodeExpire, | ||
| 60 | + Issuer: "allied_creation_gateway", | ||
| 61 | + }, | ||
| 62 | + } | ||
| 63 | + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) | ||
| 64 | + return token.SignedString([]byte(loginTokenSecret)) | ||
| 27 | } | 65 | } |
| 28 | 66 | ||
| 29 | func (t *LoginToken) ParseToken(str string) error { | 67 | func (t *LoginToken) ParseToken(str string) error { |
| 68 | + tokenClaims, err := jwt.ParseWithClaims( | ||
| 69 | + str, | ||
| 70 | + &LoginToken{}, | ||
| 71 | + func(token *jwt.Token) (interface{}, error) { | ||
| 72 | + return loginTokenSecret, nil | ||
| 73 | + }) | ||
| 74 | + if err != nil { | ||
| 75 | + return err | ||
| 76 | + } | ||
| 77 | + if claim, ok := tokenClaims.Claims.(*LoginToken); ok && tokenClaims.Valid { | ||
| 78 | + *t = *claim | ||
| 79 | + } | ||
| 30 | return nil | 80 | return nil |
| 31 | } | 81 | } |
pkg/infrastructure/cache/catcha.go
0 → 100644
| 1 | package cache | 1 | package cache |
| 2 | 2 | ||
| 3 | -import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain" | 3 | +import ( |
| 4 | + "time" | ||
| 4 | 5 | ||
| 5 | -type LoginAccessCache struct { | 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain" |
| 7 | +) | ||
| 8 | + | ||
| 9 | +//登录凭证缓存 | ||
| 10 | +type LoginTokenCache struct { | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +func (ca LoginTokenCache) keyAccessToken(account string, platform string) string { | ||
| 14 | + str := KEY_PREFIX + "accesstoken:" + account + ":" + platform | ||
| 15 | + return str | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (ca LoginTokenCache) keyRefreshToken(account string, platform string) string { | ||
| 19 | + str := KEY_PREFIX + "refreshtoken" + account + ":" + platform | ||
| 20 | + return str | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +func (ca LoginTokenCache) SaveAccessToken(access *domain.LoginAccess) error { | ||
| 24 | + nowTime := time.Now().Unix() | ||
| 25 | + exp := access.AccessExpired - nowTime | ||
| 26 | + if exp <= 0 { | ||
| 27 | + exp = 60 * 60 * 2 | ||
| 28 | + } | ||
| 29 | + key := ca.keyAccessToken(access.Account, access.Platform) | ||
| 30 | + result := clientRedis.Set(key, access.AccessToken, time.Duration(exp)) | ||
| 31 | + return result.Err() | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +func (ca LoginTokenCache) RemoveAccessToken(account string, platform string) error { | ||
| 35 | + key := ca.keyAccessToken(account, platform) | ||
| 36 | + result := clientRedis.Del(key) | ||
| 37 | + return result.Err() | ||
| 6 | } | 38 | } |
| 7 | 39 | ||
| 8 | -func (ca LoginAccessCache) Save(param *domain.LoginAccess) (*domain.LoginAccess, error) { | ||
| 9 | - return nil, nil | 40 | +func (ca LoginTokenCache) GetAccessToken(account string, platform string) (string, error) { |
| 41 | + key := ca.keyAccessToken(account, platform) | ||
| 42 | + result := clientRedis.Get(key) | ||
| 43 | + return result.Result() | ||
| 10 | } | 44 | } |
| 11 | -func (ca LoginAccessCache) Remove(param *domain.LoginAccess) (*domain.LoginAccess, error) { | ||
| 12 | - return nil, nil | 45 | + |
| 46 | +func (ca LoginTokenCache) SaveRefreshToken(access *domain.LoginAccess) error { | ||
| 47 | + nowTime := time.Now().Unix() | ||
| 48 | + exp := access.RefreshExpired - nowTime | ||
| 49 | + if exp <= 0 { | ||
| 50 | + exp = 60 * 60 * 2 | ||
| 51 | + } | ||
| 52 | + key := ca.keyAccessToken(access.Account, access.Platform) | ||
| 53 | + result := clientRedis.Set(key, access.RefreshToken, time.Duration(exp)) | ||
| 54 | + return result.Err() | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +func (ca LoginTokenCache) RemoveRefreshToken(account string, platform string) error { | ||
| 58 | + key := ca.keyRefreshToken(account, platform) | ||
| 59 | + result := clientRedis.Del(key) | ||
| 60 | + return result.Err() | ||
| 13 | } | 61 | } |
| 14 | 62 | ||
| 15 | -func (ca LoginAccessCache) FindOne(account string, platform string) (*domain.LoginAccess, error) { | ||
| 16 | - return nil, nil | 63 | +func (ca LoginTokenCache) GetRefreshToken(account string, platform string) (string, error) { |
| 64 | + key := ca.keyRefreshToken(account, platform) | ||
| 65 | + result := clientRedis.Get(key) | ||
| 66 | + return result.Result() | ||
| 17 | } | 67 | } |
| @@ -9,7 +9,7 @@ import ( | @@ -9,7 +9,7 @@ import ( | ||
| 9 | var clientRedis *redis.Client | 9 | var clientRedis *redis.Client |
| 10 | 10 | ||
| 11 | const ( | 11 | const ( |
| 12 | - keyPrefix string = "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway" | 12 | + KEY_PREFIX string = "allied:creation:gateway:" |
| 13 | ) | 13 | ) |
| 14 | 14 | ||
| 15 | func Init() *redis.Client { | 15 | func Init() *redis.Client { |
pkg/infrastructure/repository/idWorker.go
0 → 100644
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/log" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +var idWorker *snowflake.IdWorker | ||
| 9 | + | ||
| 10 | +func init() { | ||
| 11 | + worker, err := snowflake.NewIdWorker(1) | ||
| 12 | + if err != nil { | ||
| 13 | + log.Logger.Panic("idWorker init err" + err.Error()) | ||
| 14 | + return | ||
| 15 | + } | ||
| 16 | + idWorker = worker | ||
| 17 | +} |
| @@ -6,7 +6,6 @@ import ( | @@ -6,7 +6,6 @@ import ( | ||
| 6 | "github.com/go-pg/pg/v10" | 6 | "github.com/go-pg/pg/v10" |
| 7 | "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | 7 | "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" |
| 8 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 8 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
| 9 | - "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain" | 9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain" |
| 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/pg/models" | 10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/pg/models" |
| 12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/pg/transform" | 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/pg/transform" |
| @@ -17,11 +16,7 @@ type LoginAccessRepository struct { | @@ -17,11 +16,7 @@ type LoginAccessRepository struct { | ||
| 17 | } | 16 | } |
| 18 | 17 | ||
| 19 | func (repository *LoginAccessRepository) nextIdentify() (int64, error) { | 18 | func (repository *LoginAccessRepository) nextIdentify() (int64, error) { |
| 20 | - IdWorker, err := snowflake.NewIdWorker(1) | ||
| 21 | - if err != nil { | ||
| 22 | - return 0, err | ||
| 23 | - } | ||
| 24 | - id, err := IdWorker.NextId() | 19 | + id, err := idWorker.NextId() |
| 25 | return id, err | 20 | return id, err |
| 26 | } | 21 | } |
| 27 | func (repository *LoginAccessRepository) Save(loginAccess *domain.LoginAccess) (*domain.LoginAccess, error) { | 22 | func (repository *LoginAccessRepository) Save(loginAccess *domain.LoginAccess) (*domain.LoginAccess, error) { |
| @@ -143,6 +138,8 @@ func (repository *LoginAccessRepository) Find(queryOptions map[string]interface{ | @@ -143,6 +138,8 @@ func (repository *LoginAccessRepository) Find(queryOptions map[string]interface{ | ||
| 143 | query := sqlbuilder.BuildQuery(tx.Model(&loginAccessModels), queryOptions) | 138 | query := sqlbuilder.BuildQuery(tx.Model(&loginAccessModels), queryOptions) |
| 144 | query.SetOffsetAndLimit(20) | 139 | query.SetOffsetAndLimit(20) |
| 145 | query.SetOrderDirect("login_access_id", "DESC") | 140 | query.SetOrderDirect("login_access_id", "DESC") |
| 141 | + query.SetWhereByQueryOption("account", "account") | ||
| 142 | + query.SetWhereByQueryOption("platform", "platform") | ||
| 146 | if count, err := query.SelectAndCount(); err != nil { | 143 | if count, err := query.SelectAndCount(); err != nil { |
| 147 | return 0, loginAccesss, err | 144 | return 0, loginAccesss, err |
| 148 | } else { | 145 | } else { |
| @@ -229,6 +229,37 @@ func (gateway HttplibAlliedCreationUser) RoleRemove(param ReqRoleRemove) (*DataR | @@ -229,6 +229,37 @@ func (gateway HttplibAlliedCreationUser) RoleRemove(param ReqRoleRemove) (*DataR | ||
| 229 | return &data, err | 229 | return &data, err |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | +// RoleRemove 批量移除角色 | ||
| 233 | +func (gateway HttplibAlliedCreationUser) RoleBatchRemove(param ReqRoleBatchRemove) (*DataRoleBatchRemove, error) { | ||
| 234 | + urlStr := gateway.baseUrL + "/role/batch-delete" | ||
| 235 | + method := "post" | ||
| 236 | + req := gateway.CreateRequest(urlStr, method) | ||
| 237 | + log.Logger.Debug("向用户模块请求数据:批量移除角色。", map[string]interface{}{ | ||
| 238 | + "api": method + ":" + urlStr, | ||
| 239 | + "param": param, | ||
| 240 | + }) | ||
| 241 | + req, err := req.JSONBody(param) | ||
| 242 | + if err != nil { | ||
| 243 | + return nil, fmt.Errorf("请求批量移除角色失败:%w", err) | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + byteResult, err := req.Bytes() | ||
| 247 | + if err != nil { | ||
| 248 | + return nil, fmt.Errorf("获取批量移除角色失败:%w", err) | ||
| 249 | + } | ||
| 250 | + log.Logger.Debug("获取用户模块请求数据:批量移除角色。", map[string]interface{}{ | ||
| 251 | + "result": string(byteResult), | ||
| 252 | + }) | ||
| 253 | + var result service_gateway.GatewayResponse | ||
| 254 | + err = json.Unmarshal(byteResult, &result) | ||
| 255 | + if err != nil { | ||
| 256 | + return nil, fmt.Errorf("解析批量移除角色:%w", err) | ||
| 257 | + } | ||
| 258 | + var data DataRoleBatchRemove | ||
| 259 | + err = gateway.GetResponseData(result, &data) | ||
| 260 | + return &data, err | ||
| 261 | +} | ||
| 262 | + | ||
| 232 | // RoleGetRelatedUser 获取角色相关联的用户 | 263 | // RoleGetRelatedUser 获取角色相关联的用户 |
| 233 | func (gateway HttplibAlliedCreationUser) RoleGetRelatedUser(param ReqRoleGetRelatedUser) (*DataRoleGetRelatedUser, error) { | 264 | func (gateway HttplibAlliedCreationUser) RoleGetRelatedUser(param ReqRoleGetRelatedUser) (*DataRoleGetRelatedUser, error) { |
| 234 | orgId := strconv.FormatInt(param.OrgId, 10) | 265 | orgId := strconv.FormatInt(param.OrgId, 10) |
| @@ -30,9 +30,12 @@ type ( | @@ -30,9 +30,12 @@ type ( | ||
| 30 | //手机账号密码检查 | 30 | //手机账号密码检查 |
| 31 | type ( | 31 | type ( |
| 32 | ReqAuthCheckPassword struct { | 32 | ReqAuthCheckPassword struct { |
| 33 | + Password string `json:"password"` | ||
| 34 | + Phone string `json:"phone"` | ||
| 33 | } | 35 | } |
| 34 | 36 | ||
| 35 | DataAuthCheckPassword struct { | 37 | DataAuthCheckPassword struct { |
| 38 | + UserId int `json:"userId"` | ||
| 36 | } | 39 | } |
| 37 | ) | 40 | ) |
| 38 | 41 |
| @@ -36,7 +36,7 @@ type ( | @@ -36,7 +36,7 @@ type ( | ||
| 36 | OrgID int `json:"orgId"` | 36 | OrgID int `json:"orgId"` |
| 37 | RoleID int `json:"roleId"` | 37 | RoleID int `json:"roleId"` |
| 38 | RoleName string `json:"roleName"` | 38 | RoleName string `json:"roleName"` |
| 39 | - RoleType int `json:"roleType"` | 39 | + RoleType int `json:"roleType"` //角色类型 1.普通角色 1024:超级管理员 |
| 40 | UpdatedAt string `json:"updatedAt"` | 40 | UpdatedAt string `json:"updatedAt"` |
| 41 | } `json:"role"` | 41 | } `json:"role"` |
| 42 | } | 42 | } |
| @@ -130,6 +130,16 @@ type ( | @@ -130,6 +130,16 @@ type ( | ||
| 130 | } | 130 | } |
| 131 | ) | 131 | ) |
| 132 | 132 | ||
| 133 | +//批量移除角色 | ||
| 134 | +type ( | ||
| 135 | + ReqRoleBatchRemove struct { | ||
| 136 | + RoleIds []int64 `json:"roleIds"` | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + DataRoleBatchRemove struct { | ||
| 140 | + } | ||
| 141 | +) | ||
| 142 | + | ||
| 133 | //获取角色相关联的用户 | 143 | //获取角色相关联的用户 |
| 134 | type ( | 144 | type ( |
| 135 | ReqRoleGetRelatedUser struct { | 145 | ReqRoleGetRelatedUser struct { |
| @@ -139,6 +149,16 @@ type ( | @@ -139,6 +149,16 @@ type ( | ||
| 139 | } | 149 | } |
| 140 | 150 | ||
| 141 | DataRoleGetRelatedUser struct { | 151 | DataRoleGetRelatedUser struct { |
| 152 | + NotInRoleUser []struct { | ||
| 153 | + DepartmentName string `json:"departmentName"` | ||
| 154 | + UserID int `json:"userId"` | ||
| 155 | + UserName string `json:"userName"` | ||
| 156 | + } `json:"notInRoleUser"` | ||
| 157 | + RoleUser []struct { | ||
| 158 | + DepartmentName string `json:"departmentName"` | ||
| 159 | + UserID int `json:"userId"` | ||
| 160 | + UserName string `json:"userName"` | ||
| 161 | + } `json:"roleUser"` | ||
| 142 | } | 162 | } |
| 143 | ) | 163 | ) |
| 144 | 164 |
-
请 注册 或 登录 后发表评论