# 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.人员管理 管理公司所有人员,可重置用户密码,重置密码是发送邮件,所以必须配置发件邮箱,若用户离职或需要删除 此用户,在此处可注销用户,该用户则被删除,无法登陆任何应用