主题
系统用户登录
场景
在任何业务场景中,都会使用到“用户登录”,可以参考以下文档。
一、登录接口
警告
需要在微服务中编写登录接口,需要完全按照以下流程来进行。
1.1 接收参数对象
接收请求参数对象
java
@Data
public class LoginDto {
/**
* 用户名
*/
@NotBlank(message = "用户名不能为空!")
private String accountNo;
/**
* 密码
*/
@NotBlank(message = "密码不能为空!")
private String password;
}
1.2 登录接口
强制
登录接口必须返回ResultVo<SessionVo>
对象,返回其他的对象会导致登录异常。
java
/**
* 登录
* @author: fallsea
* @param dto
* @return
*/
@PostMapping(value = "/login", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<ResultVo<SessionVo>> login(@RequestBody @Valid LoginDto dto) {
return Mono.just(ResultVo.ok(loginService.login(dto)));
}
1.3 登录业务服务
警告
业务接口只需要编写登录逻辑即可,不需要用户去保存session,网关会自动处理。
java
@Override
public SessionVo login(LoginDto dto) {
if (!"admin".equals(dto.getAccountNo()) || !"123456".equals(dto.getPassword())) {
throw new InvokeException(-1, "用户名或密码不正确");
}
// 登录,创建一个session,并返回用户信息,权限信息
SessionVo session = new SessionVo();
session.setIsSystem("admin".equals(dto.getAccountNo()));// 是否超级管理员(1.是)
session.setUserId("1");//用户id
session.setNickname("wueasy");//用户昵称
Set<String> authorizeCodeList = new HashSet<String>();
authorizeCodeList.add("user");
session.setAuthorizeCodeList(authorizeCodeList);//权限代码集合,用于前端判断权限
// 可访问的url地址权限,用户有权限的url地址集合
Set<String> linkUrlSetAll = new HashSet<String>();
linkUrlSetAll.add("/demo/get");
session.setAuthorizeUrlList(linkUrlSetAll);
return session;
}
1.4 session对象属性说明
SessionVo
完成路径为com.wueasy.base.vo.SessionVo
userId
:用户idnickname
:用户昵称isSystem
:是否超级管理员,主要用于后端管理系统,需要在网关同时启用超级管理员权限;例如:超级管理员可以访问所有的接口权限。avatarUrl
:用户头像地址authorizeUrlList
:权限url集合,用户有权限访问的url,需要保证url完整路径。authorizeCodeList
:权限代码集合,用户有权限的资源代码列表,用于控制前端页面权限;例如:用户管理增删改查功能,每个按钮都有一个权限代码。extendedMap
:拓展map,存储用户其他的业务属性,解决session对象需要存储其他的数据业务场景;例如:用户登录成功后有个代理商需要存储。successfulMap
:登录成功返回的业务参数,此参数不会保存到session中,登录接口会返回此参数值。tempAuthorization
:临时授权码,网关使用,不需要业务代码中写入。
二、网关配置
警告
网关不需要任何代码开发,只需要按照如下配置。
- 1.配置路由规则
- 2.配置redis连接
- 3.配置session拦截器
yaml
logging:
file:
name: ./logs/gateway.log
max-history: 60
max-size: 100MB
level:
root: INFO
server :
port : 8080
spring:
cloud:
loadbalancer:
gateway:
discovery:
locator:
enabled: false
lowerCaseServiceId: true
routes:
#配置路径规则
- id: demo
uri: http://127.0.0.1:8081
predicates:
- Path=/demo/**
filters:
- StripPrefix= 1
data:
#配置redis
redis:
database: 9
host: 127.0.0.1
port: 6379
password: 123456
timeout: 3000
lettuce:
pool:
max-active: 100
max-wait: -1
max-idle: 10
min-idle: 0
wueasy :
gateway:
filter:
session:
enabled: true #启用session拦截器
items:
- type: redis #使用redis存储session信息
redis-auto-expire: true #启用会话自动延期
expire: PT1H #配置会话1小时过期
urls: #配置拦截的url地址,所有的/demo/请求都拦截
- /demo/**
user-login-urls: /demo/login #配置登录接口地址,需要和微服务调用的完全一致。
security-visitor-urls: #配置免登陆接口地址
- /demo/login
三、请求接口
TIP
通过发起登录请求,获取登录结果。
3.1 发起请求示例
shell
curl --location --request POST "http://127.0.0.1:8080/demo/login" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Content-Type: application/json" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:8080" ^
--header "Connection: keep-alive" ^
--data-raw "{ \"accountNo\": \"admin\", \"password\": \"123456\"}"
3.2 登录接口返回结果
authorization
值为用户访问令牌
json
{
"code": 0,
"data": {
"authorization": "demo:1:2f202192dd2744b9f5589080d765e43e"
},
"successful": true
}