# CAuth **Repository Path**: caidingnu/cauth ## Basic Information - **Project Name**: CAuth - **Description**: 一个注解实现权限校验 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-13 - **Last Updated**: 2024-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CAuth #### 介绍 CAuth是一个轻量级,简单的权限组件,其使用简单,以傻瓜式配置即可使用,配置简单,引入依赖即可实现权限控制 1技术 - commons-lang3 - servlet-api - redis 2. 实现原理 使用redis存储权限信息,通过注解结合SPEL表达式调用bean的方法实现控制权限,用户需要定义一个Spring的bean实现UserDetailsService接口,编写登录操作db的逻辑, 登录时候调用UserAuthToken.login方法则会调用UserAuthToken.login方法,登录成功后会将权限信息存储到redis中,通过注解的value参数来控制权限,value参数支持SpEL表达式, 默认的权限注解有: - hasAuth - hasAnyAuth - hasAllAuth - hasRole - hasAnyRole #### 使用说明 1. 引入依赖 ```java io.github.caidingnu cauth-spring-boot-starter 最新版 ``` 2. 配置说明 ```yaml cauth: ignores-path: - /login - /logout jwt: header-key: aa secret: aa expire-time: 360000 refresh-time-interval: 4444444 ``` - ignores-path 路由白名单 - jwt.header-key 请求头key - jwt.secret 密钥 - jwt.expire-time 登录过期时间,单位s - jwt.refresh-time-interval 刷新token时间间隔,单位s - 3. redis 配置 因为cauth的token续期是使用redis实现,所以需要配置redis, ```yaml spring: redis: host: 127.0.0.1 port: 6379 password: ``` 4. 登录逻辑bean ```java package com.cdn.demo2.service; import com.cdn.auth.user.UserDetails; import com.cdn.auth.user.UserDetailsService; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.HashSet; /** * 蔡定努 * 2024/06/29 17:08 */ @Service public class UserDeatil implements UserDetailsService { @Override public UserDetails login(String username, String password) { // 模拟db查询,如果登录成功,则返回userDetails UserDetails userDetails = new UserDetails(); HashSet strings = new HashSet<>(); strings.add("username"); strings.add("11"); strings.add("22"); strings.add("99"); userDetails.setAuthoritys(strings) .setAdmin(false) .setRoles(new HashSet()) .setUserId(0) .setUserName("") .setParam(new HashMap()); return userDetails; } } ``` 4. 测试 ```java /** * 登录 */ @RequestMapping("/login") public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) { String login; try { login = UserAuthToken.login("", ""); } catch (Exception e) { throw new RuntimeException(e); } /** * 退出 * */ @GetMapping("logout") public Object logout() { return UserAuthToken.logout(); } /** * 必须有ss权限才能访问 * @author 蔡定努 */ @GetMapping("aau") @CAuth(value = "hasAuth('ss')") public void aau(String job) { log.info("---{}",job); } /** * 必须登录才能访问 * @author 蔡定努 */ @GetMapping("bb") public void bb(String job) { log.info("---{}",job); } ```