# small-auth-starter
**Repository Path**: White-s/small-auth-starter
## Basic Information
- **Project Name**: small-auth-starter
- **Description**: 项目基于`SpringSecurity` 开发,针对日常系统中的认证、动态鉴权的统一封装。有小又快!
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-05-30
- **Last Updated**: 2023-05-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 项目介绍
项目基于`SpringSecurity` 开发,针对日常系统中的认证、动态鉴权的统一封装。对后期使用简单方便。
# 包结构
```
├─authentication 鉴权相关处理
└─SmallAccessDecisionManager 匹配当前url权限(对应的角色)用户是否拥有
└─SmallSecurityMetadataSource 匹配当前url所对应的角色
├─authorization 认证相关处理
└─SmallAuthenticationToken 自定义token
└─SmallAuthenticationTokenProvider 核心认证方法
├─config Security配置
├─constant 常量
├─filter 全局过滤器(登录入口、JWT 处理入口)
└─SmallAuthenticationProcessingFilter 认证入口
└─SmallJwtFilter jwt通用过滤器, 用于解析jwt, 并将用户信息设置到上下文中
├─handle 认证、鉴权结果处理器
├─loginlogic 登录逻辑
│ └─base
├─model 实体
└─utils 工具类
```
# 快速开始
### 1、引入依赖
```xml
com.syl
small-auth-starter
1.0-SNAPSHOT
```
### 2、提供查询用户信息接口
```java
@Override
public UserDTO getUserMessage(LoginDTO loginDTO) {
UserDTO userDTO = null;
Integer userType = loginDTO.getUserType();
String loginKey = loginDTO.getLoginKey();
String password = loginDTO.getPassword();
String loginType = loginDTO.getLoginType();
switch (loginType) {
//用户名密码
case "password":
userDTO = userService.checkUserByUserName(loginKey, password);
break;
// 手机号验证码登录
case "phoneCode":
userDTO = userService.checkUserByPhoneCode(loginKey);
break;
default:
break;
}
return userDTO;
}
```
### 3、实现登录逻辑
```java
/**
* @ClassName PhoneLogin
* @Description 账号密码登录逻辑
* @Author YunLong
* @Date 2023/5/26 9:49
*/
@Component
@Slf4j
public class PasswordLogin extends AbstractLoginLogic {
@Resource
private UserClientImpl userClient;
@Override
public String getSupportLoginType() {
return "password";
}
/**
* @Author YunLong
* @Date 2023/5/26 10:33
* @Description 登录前的操作, 一般校验LoginData的数据完整性
**/
@Override
protected void beforeLogin(LoginData loginData) {
log.info("账号密码登录前的操作。loginData:{}", loginData);
}
@Override
protected void login(LoginData loginData) {
log.info("账号密码登录中……。loginData:{}", loginData);
}
/**
* @Author YunLong
* @Date 2023/5/26 9:56
* @Description 做一些登录后的操作
**/
@Override
protected void afterLogin(SmallUserInfo smallUserInfo) {
log.info("账号密码登录成功。user:{}", smallUserInfo);
}
@Override
protected SmallUserInfo getUserDetails(LoginData loginData) {
LoginDTO loginDTO = new LoginDTO();
loginDTO.setLoginKey(loginData.getUsername());
loginDTO.setPassword(loginData.getPassword());
loginDTO.setLoginType(loginData.getLoginType());
loginDTO.setPassword(loginData.getPassword());
// 通过账号密码获取用户信息
UserDTO userMessage = userClient.getUserMessage(loginDTO);
if (userMessage != null) {
// 获取查询出来的角色ids
List collect = userMessage.getRoleDTOS().stream()
.map(e->{return e.getId().toString();})
.collect(Collectors.toList());
SmallUserInfo smallUserInfo = new SmallUserInfo();
smallUserInfo.setId(Long.valueOf(userMessage.getId()));
smallUserInfo.setUsername(userMessage.getUserName());
smallUserInfo.setPhone(userMessage.getPhone());
smallUserInfo.setOrgId(Long.valueOf(userMessage.getOrgId()));
smallUserInfo.setOrgName(userMessage.getOfficeName());
smallUserInfo.setRoleList(collect);
return smallUserInfo;
}
return null;
}
}
```
### 4、实现资源查询接口。提供查询此接口对应的角色信息
```java
/**
* @ClassName ResourceUrlServiceImpl
* @Description 实现url对应角色id的查询逻辑
* @Author YunLong
* @Date 2023/5/26 16:10
*/
@Service
public class ResourceUrlServiceImpl implements com.syl.auth.authentication.ResourceService {
@Resource
SysRoleResourceDao sysRoleResourceDao;
@Override
public List getRolesByUrl(String url) {
List roleIds = sysRoleResourceDao.selectListByResourceUrl(url);
return roleIds;
}
}
```
## 可配置项
以下配置均有默认值,可重新配置进行覆盖。
```yaml
small-security:
not-login-urls: # 指定无需登录即可访问的接口
- /user
login-url: # 指定登录接口的url
expiration: # 指定 token 过期时间
jwt-secret: # 指定 Jwt 密匙
authentication-failed-code: # 指定登录失败错误码
unauthorized-code: # 指定未认证错误码
permission-denied-code: # 指定未授权错误码
no-roles-pass: # 未配置Url时,是否直接放行
```
### 认证成功处理器
在实际开发中,我们可能需要存储 token。可实现 `LoginSuccessResultHandler` 接口来自定义功能。
```java
@Component
public class GGLoginFailureResultHandler implements LoginFailureResultHandler {
@Override
public Object handleResult(AuthenticationException e) {
return null;
}
}
```
### 首次认证流程
```mermaid
graph TD;
A(登录请求) -->b(SmallAuthenticationProcessingFilter) -->
C(SmallAuthenticationTokenProvider) -->D{AbstractLoginLogic}
D--> |无异常| D1(SmallAuthenticationSuccessHandler) -->D2(LoginSuccessResultHandler) -->D3[认证成功]
D--> |有异常| D4(SmallAuthenticationFailureHandler) -->D5(LoginFailureResultHandler) -->D6[认证失败]
```
### 后续业务请求
```mermaid
graph TD
A(业务请求) --> B(SmallJwtFilter) --> C(SmallSecurityMetadataSource)
--> D(SmallAccessDecisionManager) --> E{异常}
E --> |有异常| E1[业务请求失败, 无权访问]
E --> |无异常| E2(鉴权成功) --> E3[处理业务]
```