Easy-Security Easy-Security
首页
  • 快速使用
  • 架构介绍
  • 核心功能
版本说明
GitHub (opens new window)
首页
  • 快速使用
  • 架构介绍
  • 核心功能
版本说明
GitHub (opens new window)
  • 快速入门

    • 简介
    • 快速开始
      • 添加依赖
      • 配置
      • 实现EasySecurityServer
      • 登录及获取用户
    • 配置介绍
  • 架构介绍

    • 架构介绍
    • 微服务使用
  • 核心功能

    • 数据加密
    • 自定义扩展
目录

快速开始

这里我做了一个单项目的基础使用案例,大家可以下载下来运行并自己测试。 项目地址: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

# 配置

接口权限的统一管理以及配置,我们认为集中化管理和代码无侵入是最好的方式,
当开启认证后,所有的接口都是需要进行认证的,如果你希望某些接口不需要认证,可以通过在 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

# 实现 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

# 登录及获取用户

登录的 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
上次更新: 11/23/2023, 1:38:53 PM
简介
配置介绍

← 简介 配置介绍→

Theme by Vdoing | Copyright © 2023-2023
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式