快速开始
这里我做了一个单项目的基础使用案例,大家可以下载下来运行并自己测试。 项目地址:https://gitee.com/landashu/east-security-demo.git
注意
我们建议使用者使用 Req 封装类,以及所有接口均以 POST 的请求方式,后续如果要扩展微服务,这两项都是必须的。
# 添加依赖
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>easy-security-boot-starter</artifactId>
<version>${latest-version}</version>
</dependency>
1
2
3
4
5
2
3
4
5
# 配置
接口权限的统一管理以及配置,我们认为集中化管理和代码无侵入是最好的方式,
当开启认证后,所有的接口都是需要进行认证的,如果你希望某些接口不需要认证,可以通过在 project-url 或 special-url 达到目的。
easy:
security:
auth-enable: true # 开启认证
authorize-enable: true # 开启鉴权
request-data-enable: true # 开启 Req 请求封装
project-url: # 项目路径,不会被认证,但依然会封装 Req
- /user/login
special-url: # 特殊路径,不受认证鉴权影响,不会封装 Req
- /goods/list
- /goods/info
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 实现 EasySecurityServer
开发者可以自定义自己的 token 校验逻辑,也可以从任何地方获取 token 对应的用户数据,比如 Redis,比如数据库等。
最终开发者只需要返回相应的用户即可,该用户最终会被封装到 Req 请求类中。
@RestController
@RequestMapping("/user")
public class UserController implements EasySecurityServer {
@Override
public Object getAuthUser(String token) throws BasicException {
JWT jwt = JWT.of(token);
// 验证
if(!jwt.setKey(key.getBytes()).verify()){
throw new BasicException(BasicCode.BASIC_CODE_99986);
}
// 是否失效
Long exp = Long.valueOf(jwt.getPayload("exp").toString());
if(System.currentTimeMillis() > exp){
throw new BasicException(BasicCode.BASIC_CODE_99985);
}
// 返回用户
UserVO userVO = new UserVO();
userVO.setId(jwt.getPayload("id").toString());
userVO.setName(jwt.getPayload("name").toString());
userVO.setUrl((List<String>) jwt.getPayload("url"));
return userVO;
}
@Override
public List<String> getAuthorizeUrl(String token) throws BasicException{
UserVO userVO = (UserVO) getAuthUser(token);
return userVO.getUrl();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 登录及获取用户
登录的 Token 是要返回给前端的,然后前端每次访问的时候都要带上 token 访问,这个 token 要放到请求头里,以 'token' 做为属性
// 模拟登录,登录成功会给前端token,前端需要把token放在Headers中
@PostMapping("/login")
public Rep<UserVO> login(@RequestBody Req<UserDTO,UserVO> req){
UserDTO userDTO = req.getData();
if(StrUtil.isEmpty(userDTO.getAccount()) || StrUtil.isEmpty(userDTO.getPassword())){
return Rep.error(500,"账号或密码错误");
}
// 数据库查询
UserEntity user = db.stream().filter(i -> i.getAccount().equals(userDTO.getAccount())).findAny().get();
UserVO userVO = new UserVO();
BeanUtil.copyProperties(user,userVO,"account");
String token = JWT.create()
.setPayload("id",user.getId())
.setPayload("name",user.getName())
.setPayload("exp", System.currentTimeMillis()+60*60*1000)
.setPayload("url", userVO.getUrl())
.setKey(key.getBytes())
.sign();
userVO.setToken(token);
return Rep.ok(userVO);
}
// Req<T,U> 第一个参数为前端所传参数,第二个为后端会获取到的用户数据,
@PostMapping("/selectInfo")
public Rep<UserEntity> selectInfo(@RequestBody Req<String,UserVO> req){
UserVO userVO = req.getUser();
UserEntity user = db.stream().filter(i -> i.getId().equals(userVO.getId())).findAny().get();
return Rep.ok(user);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
上次更新: 11/23/2023, 1:38:53 PM