/** * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com). *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springblade.modules.auth.controller; import com.wf.captcha.SpecCaptcha; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import org.springblade.common.cache.CacheNames; import org.springblade.core.secure.AuthInfo; import org.springblade.core.tool.api.R; import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.RedisUtil; import org.springblade.core.tool.utils.WebUtil; import org.springblade.modules.auth.granter.ITokenGranter; import org.springblade.modules.auth.granter.TokenGranterBuilder; import org.springblade.modules.auth.granter.TokenParameter; import org.springblade.modules.auth.utils.TokenUtil; import org.springblade.modules.system.entity.UserInfo; import org.springframework.web.bind.annotation.*; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * 认证模块 * * @author Chill */ @RestController @AllArgsConstructor @RequestMapping("blade-auth") @Api(value = "用户授权认证", tags = "授权接口") public class AuthController { private RedisUtil redisUtil; @PostMapping("token") @ApiOperation(value = "获取认证token", notes = "传入租户ID:tenantId,账号:account,密码:password") public R token(@ApiParam(value = "授权类型", required = true) @RequestParam(defaultValue = "password", required = false) String grantType, @ApiParam(value = "刷新令牌") @RequestParam(required = false) String refreshToken, @ApiParam(value = "租户ID", required = true) @RequestParam(defaultValue = "000000", required = false) String tenantId, @ApiParam(value = "账号") @RequestParam(required = false) String account, @ApiParam(value = "密码") @RequestParam(required = false) String password) { String userType = Func.toStr(WebUtil.getRequest().getHeader(TokenUtil.USER_TYPE_HEADER_KEY), TokenUtil.DEFAULT_USER_TYPE); TokenParameter tokenParameter = new TokenParameter(); tokenParameter.getArgs().set("tenantId", tenantId) .set("account", account) .set("password", password) .set("grantType", grantType) .set("refreshToken", refreshToken) .set("userType", userType); ITokenGranter granter = TokenGranterBuilder.getGranter(grantType); UserInfo userInfo = granter.grant(tokenParameter); if (userInfo == null || userInfo.getUser() == null) { return R.fail(TokenUtil.USER_NOT_FOUND); } return R.data(TokenUtil.createAuthInfo(userInfo)); } @GetMapping("/captcha") @ApiOperation(value = "获取验证码") public R captcha() { SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5); String verCode = specCaptcha.text().toLowerCase(); String key = UUID.randomUUID().toString(); // 存入redis并设置过期时间为30分钟 redisUtil.set(CacheNames.CAPTCHA_KEY + key, verCode, 30L, TimeUnit.MINUTES); // 将key和base64返回给前端 return R.data(Kv.init().set("key", key).set("image", specCaptcha.toBase64())); } @PostMapping("/logout") @ApiOperation(value = "登出") public R logout() { // 登出预留逻辑 return R.data(Kv.init().set("code", "200").set("msg", "操作成功")); } }