# elegent-Auth
**Repository Path**: itliutong/elegent-auth
## Basic Information
- **Project Name**: elegent-Auth
- **Description**: ElegentAuth是一款适用于互联网项目的轻量级权限框架。 这个框架可以让你更优雅地在互联网项目中实现权限控制
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-03-18
- **Last Updated**: 2024-03-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# ElegentAuth【轻量级权限框架】
## 介绍
ElegentAuth是一款适用于互联网项目的轻量级权限框架。 这个框架可以让你更优雅地在互联网项目中实现权限控制。这个组件具有的特点:
1. 轻量级的权限框架,更易于学习,快速上手。
2. 以注解方式标注方法权限,无需复杂的初始配置。
3. 通过配置读取token中的权限列表,与业务系统的登录功能解耦。
4. 既适用于基于微服务网关的分布式架构,也适用于单体的Springboot微服务架构。
5. 提供了专业模式和整洁模式两种鉴权方式。
## 使用说明
### 微服务网关
如果你的业务系统是基于微服务网关gateway的分布式架构,那么需要做如下处理。
1.在微服务网关中引入依赖
```xml
cn.elegent
elegent-Auth-gateway
1.0.0
```
2.在微服务网关配置文件添加配置。
```yaml
elegent:
auth:
gateway:
ignore_url: /user/login
token_name: access_token #默认配置
role_path: $.roles
```
配置说明:
(1)ignore_url:忽略地址,例如登录地址,是不需要提取token的。
(2)token_name: token的头名称,默认值是access_token。
(3)role_path: token提取的jsonpath ,例如$.roles代表从token载荷的roles节点读取角色
如果是简洁模式下应该使用jsonPath读取角色名的列表。
如果是专业模式下应该使用jsonPath读取角色ID的列表。
### 微服务代码
#### 1)简洁模式
需要修改配置文件中的信息
```yml
elegent:
auth:
service:
mode: simple #默认配置
```
当然如果不进行指定配置,默认是简洁模式
##### 登录与签发token
```java
@GetMapping("/login")
public String login() throws IOException {
//TODO 数据库查询--获取用户信息
UserDTO userEntity = new UserDTO();
userEntity.setUsername("张三");
List roles=new ArrayList();
roles.add("admin");
roles.add("维修员");
userEntity.setRoles(roles);
return userService.createToken(userEntity);// JWT创建token
}
```
userService.createToken为用户封装的利用JWT创建token的方法。
##### 方法权限控制
我们只需要为方法添加@ElegentAuth注解,指定roles为访问这个方法需要的权限。
```java
@GetMapping("/testAdmin")
@ElegentAuth(roles={"admin"})
public String testAdmin(){
return "OK";
}
```
如果某个方法,多个角色都可以访问,可以指定多个角色即可。多个角色为“或”的关系。
```java
@GetMapping("/public")
@ElegentAuth(roles={"admin","维修员"})
public String testAdminAndWork(){
return "OK";
}
```
如果某个方法不添加@ElegentAuth,表示任何人都可以访问,不进行权限控制。
#### 2)专业模式
修改配置文件指定auth框架的模式是专业模式
```yml
elegent:
auth:
service:
mode: prof
```
##### 构建角色对象
构建自己的角色对象并继承框架提供的RoleDTO
```java
public class CustomRole extends RoleDTO {
/**
* 登录平台,端
*/
private String loginType;
public CustomRole() {}
public CustomRole(String loginType) {
super.putArg("loginType",loginType);
}
public CustomRole(String roleId, String roleName,String loginType) {
super(roleId, roleName);
super.putArg("loginType",loginType);
this.loginType = loginType;
}
public String getLoginType() {
return loginType;
}
public void setLoginType(String loginType) {
this.loginType = loginType;
super.putArg("loginType",loginType);
}
}
```
**注意:框架的RoleDTO中已经含有了userId和userName两个字段,这里在设置get/set方法的时候需要调用父类的putArg方法,否则会出现期望的参数丢失**
##### 用户提供全部角色数据
```java
@Service
public class RoleServiceImpl implements RoleService {
@Override
public List getAllRole() {
Date now = new Date();
List roleDTOS = new ArrayList(){
{
add(new CustomRole("1","管理员","PC"));
add(new CustomRole("2","work","PC"));
add(new CustomRole("3","加盟商","PC"));
}
};
return roleDTOS;
}
}
```
专业模式下需要用户提供所有的角色数据(提高性能)
##### 登录与签发token
```java
@GetMapping("/login")
public String login() throws IOException {
//TODO 数据库查询--获取用户信息
UserDTO userEntity = new UserDTO();
userEntity.setUsername("张三");
Date now = new Date();
RoleDTO admin =new CustomRole("1","管理员","PC");
RoleDTO work =new CustomRole("2","work","PC");
List roles=new ArrayList();
roles.add(admin.getRoleId());
roles.add(work.getRoleId());
userEntity.setRoles(roles);
return userService.createToken(userEntity);
}
```
userService.createToken为用户封装的利用JWT创建token的方法。
##### 方法权限控制
我们只需要为方法添加@ElegentAuth注解,指定roles为访问这个方法需要的权限。
```java
@GetMapping("/testAdmin")
@ElegentAuth(roles={"admin"})
public String testAdmin(){
return "OK";
}
```
如果某个方法,多个角色都可以访问,可以指定多个角色即可。多个角色为“或”的关系。
```java
@GetMapping("/public")
@ElegentAuth(roles={"admin","维修员"})
public String testAdminAndWork(){
return "OK";
}
```
如果某个方法不添加@ElegentAuth,表示任何人都可以访问,不进行权限控制。
## 参与贡献
1. 从 `master` 分支 `checkout` 一个新分支(**注**:*请务必保证 master 代码是最新的*)
2. 新分支命名格式:`docs/username_description`,例如:`docs/tom_新增分布式锁配置项`
3. 在新分支上编辑文档、代码,并提交代码
4. 最后 `PR` 合并到 `develop` 分支,等待作者合并即可