# grit **Repository Path**: solonlab/grit ## Basic Information - **Project Name**: grit - **Description**: 资源授权管理中心(中间件) - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 26 - **Forks**: 5 - **Created**: 2021-07-29 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: authority-management **Tags**: None ## README

Grit

权限管理系统,或者资源授权管理中心,或者权限控制中台

Maven AGPL3.0 jdk-8+
gitee star github star

## 功能 * 资源管理 * 资源空间(相当于应用系统) * 资源组(相当于频道、模块) * 资源 * 可见(相当于菜单) * 可不见(相当于权限码) * 主体管理 * 主体组 * 可见(相当于企业、机构、部门) * 不可见(相当于角色) * 主体(相当于登录用户) ## 开始 * 了解框架与构件 | 开发框架 | 说明 | |--------------------------|--------------------------------------| | grit-client | grit 接口申明及数据实体定义。支持Remote调用与Local调用 | | grit-client-solon-solon | grit-client 集成插件(带 solon-auth 适配) | | grit-server-api | grit-client 接口实现(可做为插件集成到别的服务) | | grit-server-ui-durian | grit-server + 管理界面实现(可做为插件集成到别的管理后台) | | grit-server-solon-solon | grit-server 集成插件 | | 镜像输出 | 说明 | |--------------------|-----------------------| | noearorg/gritdock:2.0.2 | Grit 权限管理、接口服务及菜单导航服务 | 单体项目,可通过 grit-server-ui-durian 集成,直接获取客户端接口与管理能力 * 控制台演示站 授权管理地址: [http://grit.noear.org/grit/](http://grit.noear.org/grit/) (账号:grit ;密码:UjKeQwBK1oCUOCvl ) 效果预览地址:[http://grit.noear.org/](http://grit.noear.org/) (已有演示主体,账号:admin ;密码:admin ) * 部署说明 具体参考:[_deploy](_deploy) * 管理说明 上面的演示控制台,可以先上去看看。或者看视频:[https://www.bilibili.com/video/BV1Hy42187cn/](https://www.bilibili.com/video/BV1Hy42187cn/) ## 应用 ### 配置应用 #### 1、单体模式 * 依赖包配置(pom.xml) ```xml org.noear grit-solon-plugin 2.0.2 org.noear grit.server 2.0.2 ``` * 应用属性配置(app.yml)//需要先初始化好数据库 ```yml solon.app: name: "demoadmin" group: "demo" grit.db: schema: grit server: grit.io:3306 username: demo password: 123456 ``` #### 2、分布式模式 * 依赖包配置(pom.xml) ```xml org.noear grit-solon-plugin 2.0.2 ``` * 应用属性配置(app.yml)//直接申明服务地址 ```yml solon.app: name: "demoadmin" group: "demo" grit: server: "http://localhost:7281" token: "B6uWZDYUm4kMscdEAERXQ2wMBW1nLL0j" ``` #### 3、分布式模式(使用注册与发现服务) * 依赖包配置(pom.xml) ```xml org.noear grit-solon-plugin 2.0.2 org.noear water-solon-cloud-plugin 2.8.0 ``` * 应用属性配置(app.yml)//从发现服务获取服务地址 ```yml solon.app: name: "demoadmin" group: "demo" solon.cloud.water: server: "waterapi:9371" #WATER服务地址 #此内容可以放到配置服务里 grit: server: "@gritapi" #会借用发现服务获取集群节点 token: "B6uWZDYUm4kMscdEAERXQ2wMBW1nLL0j" ``` #### 4、其它模式 略... ### 代码应用 ```java //1,定义认证处理器 public class AuthProcessorImpl extends GritAuthProcessor { } //2,配置验证规则 @Configuration public class DemoConfig{ @Bean public void initAuth() { //适配认证框架 AuthUtil.adapter() .loginUrl("/login") .addRule(r -> r.include("**").verifyIp().failure((c, t) -> c.output(c.realIp() + ", not whitelist"))) //增加ip白名单验证规则 .addRule(r -> r.exclude("/login**").exclude(HealthHandler.HANDLER_PATH).exclude("/_**").verifyPath()) //增加uri验证规则 .processor(new AuthProcessorImpl()) //绑定验证处理器 .failure((ctx, rst) -> { ctx.render(Result.failure(403,"你,没有权限哟!")); }); } } //3,登录示例 @Controller public class LoginController{ @Mapping("/login") public Result login(String userName, String userPassword){ //尝试登录 Subject subject = GritClient.global().auth().login(userName, userPassword); if (Subject.isEmpty(subject)) { return Result.failure("提示:账号或密码不对!"); } else { //加载用户主体信息到会话状态 Session.current().loadSubject(subject); //找到用户有权限的一个可见uri Resource res = GritClient.global().auth().getUriFrist(subject.subject_id); if (Utils.isEmpty(res.link_uri)) { //如果没找到 return Result.failure("提示:请联系管理员开通权限!"); } else { //如果找到,让前端到跳到目标地址 String resUrl = GritUtil.buildDockUri(res); return Result.succeed(resUrl); } } } } //4,权限控制示例 @Controller public class DemoController{ //注解模式 @AuthPermissions("demo:admin") public void demo_ajax_del(String key){ //删除操作,有 demo:admin 权限的人才能操作 } //代码模式 public void demo_ajax_del2(String key){ //删除操作,有 demo:admin 权限的人才能操作 if(GritClient.global().auth().hasPermission(subject_id, "demo:admin")){ return; } } } //5,构建动态菜单的示例 @Component("view:header") public class HeaderTag implements TemplateDirectiveModel{ public void execute(){ //获取用户有权限的可见uri分组 List groupList = GritClient.global().auth().getUriGroupList(subjectId); //获取分组的uri资源列表(内部是虚拟树) List list = GritClient.global().auth().getUriListByGroup(subjectId, group.resource_id); //获取分组的第一个uri资源 ResourceEntity frist = GritClient.global().auth().getUriFristByGroup(subjectId, group.resource_id); } } ``` 实战参考:[https://gitee.com/noear/water/tree/master/wateradmin](https://gitee.com/noear/water/tree/master/wateradmin)