# UMS
**Repository Path**: zped/UMS
## Basic Information
- **Project Name**: UMS
- **Description**: 用户管理脚手架,集成:验证码、手机登录、第三方登录(自动注册,绑定与解绑)、基于 RBAC 的 uri 访问权限控制功能、通过统一的回调地址入口实现多回调地址的路由功能、签到等功能。通过实现几个 API 接口就可以实现上述功能,实现快速开发,只需要专注于业务逻辑。
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: https://github.com/ZeroOrInfinity/UMS
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 66
- **Created**: 2020-09-24
- **Last Updated**: 2022-05-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# UMS (user manage scaffolding) 用户管理脚手架: [github](https://github.com/ZeroOrInfinity/UMS) [gitee](https://gitee.com/pcore/UMS)








用户管理脚手架集成:验证码、手机登录、支持qq,weibo,weixin,gitee第三方登录(自动注册,绑定与解绑)、基于 RBAC 的 uri
访问权限控制功能、通过统一的回调地址入口实现多回调地址的路由功能、签到等功能。通过实现几个 API
接口就可以实现上述功能,实现快速开发,只需要专注于业务逻辑。
User management scaffolding, integration: validate code, mobile login, OAuth2(automatic registration, binding and unbinding), RBAC-based uri access control function, routing function of multiple callback addresses through a unified callback address entry, and sign etc...

## 一、`UMS 功能列表(UMS feature list)`:
- 验证码(图片,短信)校验功能(validate code (image, SMS) verification function)。
- 手机登录功能,登录后自动注册(Mobile login function, automatic registration after login)。
- 第三方登录功能(qq,weibo,weixin,gitee),登录后自动注册,与用户账号绑定与解绑(OAuth2, binding and unbinding)。
- 登录路由功能 (login routing)
- 统一回调地址路由功能(Unified callback address routing function)。
- 访问权限控制功能(Access control function)。
- 简化 session、remember me、crsf 等配置(Simplify session、remember me、srsf etc configuration)。
- 根据设置的返回方式(JSON 与 REDIRECT)返回 json 或 html 数据。
- 签到功能(sign)。
## 二、`打包项目(Package)`:
- `mvn clean package -Dmaven.test.skip=true -Pdev`
- `mvn clean package -Dmaven.test.skip=true -Pprod`
- 发布到远程仓库
> `mvn clean deploy -Pprod --settings ~/settings.xml`
## 三、`TODO List`:
- demo 待完善
- 第三方登录功能添加 JustAuth 工具, 支持更多的第三方登录.
## 四、`使用方式(Quick Start)`:
- 添加依赖(Add Dependency): 根据所需的功能打入相应的依赖
```xml
top.dcenter
ums-core-spring-boot-starter
1.0.6
top.dcenter
ums-social-spring-boot-starter
1.06
```
- 通过 application.yml 或 application.properties 配置(See below `五`): 查看下方`五`的 application.properties 或 application.yml 配置.
- 实现对应功能时需要实现的接口(The interface that needs to be implemented when the corresponding function is present):
1. 用户服务(user service): `必须实现(Must implemented)`
- 有 social 模块时: `AbstractSocialUserDetailsService`
- 无 social 模块时: `AbstractUserDetailsService`
2. 图片验证码(image validate code): 如果不实现就会使用默认图片验证码, 实时生产验证码图片, 没有缓存功能
- `ImageCodeFactory`
3. 短信验证码(SMS validate code): `默认空实现`
- `SmsCodeSender`
4. 自定义验证码(customize validate code):
- `AbstractValidateCodeProcessor`
- `ValidateCodeGenerator`
5. 访问权限控制功能(Access control function): 基于 RBAC 的访问权限控制, 增加了更加细粒度的权限控制, 如: 对菜单与按钮的权限控制
- `AbstractUriAuthorizeService` 类中的方法`getRolesAuthorities()`;
`getRolesAuthorities()`返回值: Map<`role`, Map<`uri`, `UriResourcesDTO`>>, `UriResourcesDTO` 中字段 `uri`
与 `permission` 必须有值.
- 使用方法(Usage):
- 类上添加: @EnableUriAuthorize(filterOrInterceptor = false),
filterOrInterceptor=false 时为拦截器(注解方式)模式; filterOrInterceptor=true 时为过滤器模式.
- filterOrInterceptor=true 时, 启用过滤器模式, 无需在方法上配置:
注意: 过滤器模式必须 uri(此 uri 不包含 servletContextPath) 与 权限是一对一关系, 也就是说不适合 restful 风格的 API.
```java
// 例如: 给角色 ROLE_USER 的 uri=/test/permission/** 添加编辑(edit)权限,
public class UriPermissionService {
@Autowired
private RoleResourcesService roleResourcesService;
@Autowired
private UriResourcesService uriResourcesService;
@Autowired
private UserRoleService userRoleService;
@Autowired
private RoleService roleService;
// 注意: 此 uri 不包含 servletContextPath .
public boolean addUriPermission(String role, String uri, List permissionSuffixTypeList) {
// 1. 创建 UriResources
UriResources uriResources = new UriResources();
// ...
uriResources.setUrl(uri);
// 添加 uri 的编辑(edit)权限. 注意: 此 uri 不包含 servletContextPath .
// 这里用了 PermissionSuffixType 枚举来规范添加 uri 权限后缀, 详细信息查看 PermissionSuffixType 枚举.
// 注意: 过滤器模式必须 uri 与 权限是一对一关系
uriResources.setPermission(String.format("%s%s",
uri, PermissionSuffixType.EDIT.getPermissionSuffix()));
//uriResources.setPermission(String.format("%s%s%s%s%s%s",
// uri,
// PermissionSuffixType.EDIT.getPermissionSuffix(),
// AbstractUriAuthorizeService.PERMISSION_DELIMITER,
// uri,
// PermissionSuffixType.LIST.getPermissionSuffix()));
// 存入数据库
uriResourcesService.save(uriResources);
// 2. 给角色 ROLE_USER 添加 uri 权限
Long roleId = roleService.getIdByRole(role);
RoleResource roleResource = new RoleResource();
// ...
roleResource.setRoleId(roleId);
roleResource.setUriResources(uriResources.getId());
// 存入数据库
roleResourcesService.save(roleResource);
}
}
// =======================================================================
/**
* 权限后缀类型
* @author zyw
* @version V1.0 Created by 2020/9/17 9:33
*/
public enum PermissionSuffixType {
/**
* 查询
*/
LIST("GET")
{
@Override
public String getPermissionSuffix() {
return ":list";
}
},
/**
* 添加
*/
ADD("POST")
{
@Override
public String getPermissionSuffix() {
return ":add";
}
},
/**
* 更新
*/
EDIT("PUT")
{
@Override
public String getPermissionSuffix() {
return ":edit";
}
},
/**
* 删除
*/
DELETE("DELETE")
{
@Override
public String getPermissionSuffix() {
return ":del";
}
};
/**
* request method
*/
@Getter
private String method;
PermissionSuffixType(String method) {
this.method = method;
}
/**
* 获取权限后缀
* @return 返回权限后缀
*/
public abstract String getPermissionSuffix();
/**
* 根据 requestMethod 获取权限后缀
* @param method requestMethod
* @return 权限后缀, 如果 method 不匹配, 返回 null
*/
public static String getPermissionSuffix(String method) {
Objects.requireNonNull(method, "method require non null");
PermissionSuffixType[] types = values();
for(PermissionSuffixType type: types){
if (type.method.equals(method.toUpperCase()))
{
return type.getPermissionSuffix();
}
}
return null;
}
}
```
- filterOrInterceptor=false 时, 拦截器方式, 在方法上添加注解 `@UriAuthorize("/test/permission:add")`即可实现权限控制. 示例:
```java
@Component
@Slf4j
public class DemoUriAuthorizeService extends AbstractUriAuthorizeService {
@Override
public Optional