# xu-sso
**Repository Path**: sysadm/xu-sso
## Basic Information
- **Project Name**: xu-sso
- **Description**: 轻量级单点登录,对人员,项目,权限的统一管理
- **Primary Language**: Java
- **License**: AGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 9
- **Created**: 2019-11-28
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# xu-sso
### 项目介绍
xu-sso是一个轻量级的统一认证权限管理平台,其核心目的是帮助开发者快速建立一套统一的认证权限平台,
以最简单的方式进行接入,低侵入,低耦合。
支持接口权限拦截,目前仅限于基于web页面的接口,前后端分离的接口,因为当前token的保存依赖于cookie。
新版本支持head。
### 项目功能
1. 单点登录
2. 人员管理
3. 部门管理
4. 项目管理
5. 角色管理
6. 权限管理
7. api接口
## 1.2.2版本更新
优化redis工具
修复有可能redis频繁创建连接,释放资源导致的问题
添加redis哨兵模式支持,现支持单机,哨兵,集群模式
如果是哨兵模式,请新增配置参数:masterID
com.xu.sso.redis.masterId=mymaster
## 1.2.1版本更新
支持ant过滤规则
| Wildcard | Description |
| ------------- |:-------------:|
| ? | 匹配任意单字符 |
| * | 匹配0或者任意数量的字符,不包含/ |
| ** | 匹配0或者更多数量的目录,不包含/ |
| Path | Description |
| ------------- |:-------------:|
| /app/p?ttern | 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern |
| /**/example | 匹配项目根路径下 /project/example, /project/foow/example, /example.... |
| /app/delete* | 匹配(Matches) /app/deleteUser, /app/deleteApp.... |
需要注意的是,路径匹配遵循最长匹配原则(has more characters),例如/app/dir/file.jsp符合/**/*.jsp和/app/dir/*.jsp两个路径模式,那么最终就是根据后者来匹配。
---
## 1.2.0版本更新
新增接口登录登出,client支持head,允许请求时将token放入head,head名与cookie一致,都为token
接口登录:http://localhost:8282/api/login
请求参数:
```json
{
"appId":"",
"username":"",
"password":""
}
```
响应参数:
```json
{
"code":"Success",
"msg":"成功",
"token":"91be1d5d818943c0b50bd368284bc01e"
}
```
接口登出:http://localhost:8282/api/logout
请求参数:
```json
{
"token":"91be1d5d818943c0b50bd368284bc01e"
}
```
响应参数:
```json
{
"code": "Success",
"msg": "成功"
}
```
---
### 安装教程
1. 执行sql建表,在初始化信息中,会初始化admin用户,建议初始化时添加自己的邮箱账户,
在重置密码的时候需要发送邮件,建议改成自己的账户(此系统中无admin超级管理员一说),
所有的角色权限都是根据不同项目独立的
2. app-sso-server项目为认证服务,配置application-dev.properties文件
1. 添加redis配置,建议使用redis集群, 多个地址以","分隔,若使用了redis集群,
分别将app-sso-server和app-sso-web项目中的RedisUtil替换成RedisClusterUtil,
将sso-client中的ClientRedisUtil替换成ClientRedisClusterUtil,重新打包
2. 添加公司邮箱后缀,用于注册时验证,非公司邮件无法在登录也注册,拥有权限的用户可在
app-sso-web后台添加用户,此入口添加的用户不会限制公司邮箱
3. 通知邮箱配置,用于发送注册信息,重置密码信息,若不配置,则无法获取注册密码,重置密码
4. 添加数据源配置
3. app-sso-web项目为后台管理项目,对人员项目权限等的统一管理,配置properties文件
1,2,3,4步骤同server服务配置
5. 添加sso认证服务器配置
```
com.xu.sso.service.path=http://localhost:8180 app-sso-server的地址
com.xu.sso.logout.path=/logout 用户注销路径,接入的应用中不需要有此实现,只需要在页面中添加注销按钮,将注销路径配置在此就行
com.xu.sso.app_id=app-sso-web 当前接入应用的AppID,此ID需在sso-web后台注册时保持一致,一旦注册后不可更改
com.xu.sso.interval=0 应用权限更新间隔,单位:毫秒,-1为不更新
```
所有配置完成后,使用mvn命令进行打包,部署到服务器上
### 接入说明(请先将client包上传至公司maven私服,方便接入)
* 如果是前后端分离模式接入,或者有用到ajax请求的,在前端需添加全局ajax设置,用于登录跳转和权限拦截提示
* client中拦截请求,判断是否为ajax请求的,是通过header里的"X-Requested-With"参数值为"XMLHttpRequest",
目前测试jQuery中能正常判断,若使用的是前端框架的,在接入中无法判断出ajax请求的,请在前端发起请求前加入此参数,
可作为ajax的全局请求参数
* 前后端分离模式中,在登录成功,跳转到配置的页面时,前端需从url中获取token,放入cookie中,
cookie名为token
```js
// jquery ajax 登录跳转,权限拦截弹框示例
$.ajaxSetup({
error: function(xhr,status,error) {
if (401 == xhr.status) {
window.location.href = xhr.responseText;
} else if (403 == xhr.status) {
// 可使用自定义弹框提示
layer.alert(xhr.responseText, {icon: 5});
}
}
});
```
## 登录权限接入方式
pom引入client依赖
```xml
com.xu.sso
sso-client
最新版本
```
添加 properties参数
```
# sso服务器地址
com.xu.sso.service.path =
# 当前项目的用户注销路径(此功能后端无需提供,只需前端和前端注销按钮请求路径一致)
com.xu.sso.logout.path = /logout
# 当前项目id
com.xu.sso.app_id =
# 项目权限刷新时间(毫秒),-1为不刷新
com.xu.sso.interval = 0
# redis
com.xu.sso.redis.host =
com.xu.sso.redis.password =
com.xu.sso.redis.database =
# 如果是哨兵模式,请填写masterID,默认为mymaster
com.xu.sso.redis.masterId=mymaster
```
添加filter配置
spring boot 不需要主动设置filter,只需要添加spring扫描路径,在Application启动类上添加扫描路径
@ComponentScan(basePackages = {"com.xu.sso"})
spring 项目
添加包扫描路径:
添加web.xml里filter配置,loginFilter必须排在powerFilter之前
```
loginFilter
org.springframework.web.filter.DelegatingFilterProxy
loginFilter
/*
powerFilter
org.springframework.web.filter.DelegatingFilterProxy
powerFilter
/*
```
最后,在认证平台后台管理系统里注册下应用
在后台创建项目的人员,会自动成为项目负责人权限,项目负责人权限可转移,最多可添加3人
接入完成后,在项目中使用时,若需要获取当前登录用户信息,Java后端可使用
```
UserLoginInfo userLoginInfo = LoginFilter.threadLocal.get();
// 或者通过request获取
UserLoginInfo userLoginInfo = (UserLoginInfo)request.getAttribute(SSOConfig.SSO_USER);
```
登录后会将用户信息放入到threadLocal跟request中,在页面中,可通过request获取用户信息
## API获取用户和角色信息接入
pom引入client依赖
```xml
com.xu.sso
sso-client-api
最新版本
```
添加 properties参数
# sso服务器地址
com.xu.sso.service.path =
# 当前项目的appId
com.xu.sso.app_id =
# key从sso管理后台,通过api授权获取
com.xu.sso.key =
#### 使用方式
直接在项目中通过spring注入
````
@Autowired
private OpenApiService openApiService;
````
所有接口:
````injectedfreemarker
/**
* 查询所有用户列表
*
* @return
*/
List findAllUser();
/**
* 通过username列表查询对应用户列表
*
* @param usernames
* @return
*/
List findUserInList(List usernames);
/**
* 模糊查询
*
* @param username
* @return
*/
List findUserByLikeName(String username);
/**
* 查询用户
*
* @param username
* @return
*/
OpenUserInfo findUserByName(String username);
/**
* 查询用户所拥有的角色
* @param username
* @return
*/
List findUserRoles(String username);
````
### 使用说明
##### 1.新应用注册
在应用管理中,添加新应用,所填写的APP ID必须和项目中配置的一致,AppID一旦创建后不能更改。
访问权限:公共项目允许所有登录用户直接访问,私有项目需要登录用户授权才能访问。服务类型:
当前版本无太大影响,在首页应用导航中,只有web项目才会展示。在项目新建的时候,会默认添加
当前创建人为项目负责人权限,此权限仅限在sso-web后台对此项目的操作权限,比如添加项目角色,
添加项目权限等,跟项目访问中所需要的角色权限无关。负责人权限可转移,最多可添加3人
##### 2.应用角色维护
各项目的角色互相独立,角色的创建仅是一个身份标识,需要对限制的接口添加角色限制并生效后,只有
拥有该角色的用户才允许进行访问
##### 3.应用权限维护
接口权限分为:是否登录,角色限制只针对需要登录验证的接口才生效
对需要进行身份限制的接口服务添加角色,只有拥有该角色的用户才允许访问,添加完后需要刷新缓存生效
##### 4.用户授权
如果是私有项目,用户想要访问该应用,先需要添加该用户授权,私有应用只允许授权的用户进行访问,
公有应用,用户只需要登录就能进行访问。对用户进行角色授权,可添加对应的角色,也可以提升用户为
该项目的负责人权限
##### 5.开放api授权
用于api接入,来获取用户和角色的信息,api的接入适用于想要自定义角色权限的应用,只接入sso的登录,
不接入权限,并通过api来获取用户进行自定义的权限拦截
##### 6.人员管理
管理公司所有人员,可重置用户密码,重置密码是发送邮件,所以必须配置发件邮箱,若用户离职或需要删除
此用户,在此处可注销用户,该用户则被删除,无法登陆任何应用