# shaun
**Repository Path**: quickthinking/shaun
## Basic Information
- **Project Name**: shaun
- **Description**: 基于pac4j的安全框架
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 75
- **Created**: 2020-03-09
- **Last Updated**: 2024-06-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
一个基于pac4j的安全框架
# 特性:
1. 功能简单,易于集成。
2. 无 session。
3. 使用凭证(token) 进行身份验证(默认是 jwt)。
4. 前后端不分离下,能依托pac4j的各种client快速集成三方登录(redirect跳转那种),例如oauth(qq,微信) 和 cas。
# 模块简介
- shaun-core: 核心包。
- shaun-spring-boot-starter: spring boot 快速启动包。
- shaun-test-cookie: 前后端不分离下的测试演示。
- shaun-test-stateless-cookie: 前后端分离下使用cookie存token的测试演示。
- shaun-test-stateless-header: 前后端分离下使用request header携带token的测试演示。
# 使用方法
1. 引入shaun-spring-boot-starter。
```xml
com.baomidou
shaun-spring-boot-starter
${version}
```
2. 登录后设置相关信息到SecurityManager。
```java
@Service
@AllArgsConstructor
public class LoginServiceImpl implements LoginService {
private final SecurityManager securityManager;
@Override
@Transactional
public String login() {
// 登录成功后把用户角色权限信息存储到profile中
final TokenProfile profile = new TokenProfile();
profile.setId(userId.toString());
//profile.setRoles(roles);
//profile.setPermissions(permissions);
//profile.addAttribute("key","value");
final String token = securityManager.login(profile);
return token;
}
```
3. 设置yml启动信息。
```yaml
shaun:
salt: 32位字符串,非必须字段
exclude-path: # 排除具体的路径
- /v2/api-docs
- /swagger-resources
- /doc.html
exclude-branch: # 排除以此路径开头
- /webjars
expire-time: '1d' # 不设置默认永久有效
# jwt 超时时间 10s : 表示10秒有效
# 10m 结尾: 表示10分钟有效
# 10h 结尾: 表示10小时有效
# 1d : 表示有效时间到第二天 00:00:00
# 2d1h : 表示有效时间到第二天 01:00:00
# d 后面 只支持上面三个(`s`,`m`,`h`)之一
```
4. 注解拦截。
类似于shiro,shaun也默认支持使用注解在controller上拦截。
相关的注解有 `@HasAuthorization` `@HasPermission` `@HasRole` 。
```java
@HasPermission(value = {"add","edit"},logical = Logical.BOTH) //权限必须同时存在
@HasPermission(value = {"add","edit"},logical = Logical.ANY) //权限任一存在
```
5. 前后端交互。
默认配置下 前端登录后需要把后端返回的token存下,后续接口的请求头带上Authorization。
后端可以通过 TokenProfile profile = ProfileHolder.getProfile(); 获得登录设置进去的用户信息。
如获得登录设置进token里的用户ID继续进行业务逻辑处理。
如 `Long id= ProfileHolder.getProfile().getId();`