# 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);
}
```