package com.usthe.tom.controller;
import com.usthe.tom.pojo.dto.Account;
import com.usthe.tom.pojo.dto.Message;
import com.usthe.tom.service.AccountService;
import com.usthe.sureness.util.JsonWebTokenUtil;
import com.usthe.tom.support.log.LogExeManager;
import com.usthe.tom.support.log.LogTaskFactory;
import com.usthe.tom.util.AesUtil;
import com.usthe.tom.util.CommonUtil;
import com.usthe.tom.util.IpUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @author tomsun28
* @date 00:24 2019-08-01
*/
@RestController
@RequestMapping("/auth")
@Slf4j
@Api(tags = "注册认证")
public class AccountController {
@Autowired
private AccountService accountService;
@Autowired
private StringRedisTemplate redisTemplate;
@ApiOperation(value = "站内登录,签发token", notes = "适用 username|email|phone + password")
@PostMapping("/token")
public ResponseEntity<Message> issueJwtToken(@RequestBody @Validated Account account, HttpServletRequest request) {
if (account.getUserKey() != null) {
String saveKey = "tom-transfer-key-" + IpUtil.getIpFromRequest(request) + account.getUserKey();
String transferKey = redisTemplate.opsForValue().get(saveKey);
if (transferKey == null) {
Message message = Message.builder().msg("transfer-key has expired").build();
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(message);
}
account.setCredential(AesUtil.aesDecode(account.getCredential(), transferKey));
}
boolean authenticatedFlag = accountService.authenticateAccount(account);
if (!authenticatedFlag) {
Message message = Message.builder()
.msg("username or password not incorrect").build();
if (log.isDebugEnabled()) {
log.debug("account: {} authenticated fail", account);
}
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(message);
}
List<String> ownRole = accountService.loadAccountRoles(account.getIdentifier());
long refreshPeriodTime = 36000L;
String jwt = JsonWebTokenUtil.issueJwt(UUID.randomUUID().toString(), account.getIdentifier(),
"tom-auth-server", refreshPeriodTime >> 1, ownRole,
null, false);
Map<String, String> responseData = Collections.singletonMap("token", jwt);
Message message = Message.builder().data(responseData).build();
if (log.isDebugEnabled()) {
log.debug("issue token success, account: {} -- token: {}", account, jwt);
}
LogExeManager.getInstance().executeLogTask(LogTaskFactory.loginLog(account.getIdentifier(), IpUtil.getIpFromRequest(request), true, "登录成功"));
return ResponseEntity.status(HttpStatus.CREATED).body(message);
}
@ApiOperation(value = "站内注册", notes = "适用 username|email|phone + password")
@PostMapping("/register")
public ResponseEntity<Message> accountRegister(@RequestBody @Validated Account account, HttpServletRequest request) {
if (account.getUserKey() != null) {
String saveKey = "tom-transfer-key-" + IpUtil.getIpFromRequest(request) + account.getUserKey();
String transferKey = redisTemplate.opsForValue().get(saveKey);
if (transferKey == null) {
Message message = Message.builder().msg("transfer-key has expired").build();
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(message);
}
account.setCredential(AesUtil.aesDecode(account.getCredential(), transferKey));
}
if (accountService.registerAccount(account)) {
Map<String, String> responseData = Collections.singletonMap("success", "sign up success, login after");
Message message = Message.builder().data(responseData).build();
if (log.isDebugEnabled()) {
log.debug("account: {}, sign up success", account);
}
LogExeManager.getInstance().executeLogTask(LogTaskFactory.registerLog(account.getIdentifier(), IpUtil.getIpFromRequest(request), true, "注册成功"));
return ResponseEntity.status(HttpStatus.CREATED).body(message);
} else {
LogExeManager.getInstance().executeLogTask(LogTaskFactory.registerLog(account.getIdentifier(), IpUtil.getIpFromRequest(request), false, "注册失败"));
Message message = Message.builder()
.msg("username already exist").build();
return ResponseEntity.status(HttpStatus.CONFLICT).body(message);
}
}
@ApiOperation(value = "获取账户信息传输密钥", notes = "适用 password 加密")
@GetMapping("/transfer/key")
public ResponseEntity<Message> transferKey(HttpServletRequest request) {
// 动态生成秘钥,redis存储秘钥供之后秘钥验证使用,设置有效期30秒用完即丢弃
String transferKey = CommonUtil.getRandomString(16);
String userKey = CommonUtil.getRandomString(4);
String saveKey = "tom-transfer-key-" + IpUtil.getIpFromRequest(request) + userKey;
redisTemplate.opsForValue().set(saveKey, transferKey,30, TimeUnit.SECONDS);
Map<String, String> responseMap = new HashMap<>(4);
responseMap.put("transferKey", transferKey);
responseMap.put("userKey", userKey);
return ResponseEntity.ok().body(Message.builder().data(responseMap).build());
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统
资源推荐
资源详情
资源评论
收起资源包目录
bootshiro-master.zip (71个子文件)
bootshiro-master
bootshiro.yaml 692B
postman_test_example.json 9KB
pom.xml 5KB
image
image1.PNG 116KB
jetbrains.svg 5KB
image6.PNG 60KB
image5.PNG 72KB
image3.PNG 63KB
image7.PNG 93KB
image4.PNG 52KB
image8.PNG 124KB
image2.PNG 108KB
src
test
java
com
usthe
tom
TomApplicationTest.java 157B
main
resources
sureness.yml 2KB
application.yml 1KB
logback-spring.xml 6KB
db
schema.sql 6KB
data.sql 6KB
java
com
usthe
tom
controller
RoleController.java 5KB
AccountController.java 6KB
UserController.java 3KB
ResourceController.java 3KB
LogController.java 2KB
dao
AuthUserDao.java 1KB
AuthResourceDao.java 3KB
AuthRoleDao.java 767B
AuthUserRoleBindDao.java 1KB
AuthOperationLogDao.java 282B
AuthRoleResourceBindDao.java 1KB
AuthAccountLogDao.java 276B
pojo
entity
AuthUserRoleBind.java 774B
AuthRole.java 1KB
AuthRoleResourceBind.java 794B
AuthResource.java 1KB
AuthAccountLog.java 700B
AuthUser.java 1KB
AuthOperationLog.java 726B
dto
BaseTreeNode.java 1005B
Message.java 657B
MenuTreeNode.java 569B
Account.java 1008B
service
ResourceService.java 2KB
LogService.java 713B
RoleService.java 2KB
impl
DataConflictException.java 257B
AccountServiceImpl.java 4KB
RoleServiceImpl.java 4KB
LogServiceImpl.java 1KB
ResourceServiceImpl.java 4KB
AccountService.java 2KB
support
SpringContextHolder.java 2KB
GlobalExceptionHandler.java 4KB
log
LogExeManager.java 976B
LogTaskFactory.java 4KB
LogFactory.java 1KB
util
TreeUtil.java 1KB
CommonUtil.java 683B
AesUtil.java 5KB
IpUtil.java 2KB
Md5Util.java 2KB
TomApplication.java 526B
sureness
SurenessFilterExample.java 5KB
processor
RefreshJwtProcessor.java 4KB
RefreshExpiredTokenException.java 376B
provider
DatabaseAccountProvider.java 703B
DatabasePathTreeProvider.java 978B
config
SurenessConfiguration.java 5KB
config
SwaggerConfiguration.java 2KB
SecurityCorsConfiguration.java 1KB
Dockerfile 321B
.gitignore 256B
共 71 条
- 1
资源评论
白话机器学习
- 粉丝: 8256
- 资源: 7686
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功