# 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 ![](doc/images/logob.png) # 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` 分支,等待作者合并即可