```xml
<dependency>
  <groupId>org.noear</groupId>
  <artifactId>grit-client-solon-plugin</artifactId>
  <version>2.2.1</version>
</dependency>
```

### 1、描述

（使用时，需要配置“企业版 Licence”）基于 grit 构建，提供单点登录（SSO）和签权服务（Auth）。可与 server 同时使用，实现单体效果；也可以分开使用，实现中间件效果。主要接口：


| 接口                      | 获取         | 说明         | 
| --------------- | -------- |  -------- | 
| ResourceService                | GritClient.global().resource()                     | 资源接口              | 
| ResourceLinkService          | GritClient.global().resourceLink()               | 资源关联接口         | 
| ResourceSchemaService     | GritClient.global().resourceSchema()         | 资源架构接口（用于导入导出空间资源）         | 
| | | |
| SubjectService                   | GritClient.global().subject()                      | 主体接口               | 
| SubjectLinkService             | GritClient.global().subjectLink()                 | 主体关联接口         | 
| | | |
| AuthService                       | GritClient.global().auth()                          | 签权接口                 | 

可以直接使用（基于 solon-auth 接口规范），或者对接 sa-token 之类的鉴权框架。

### 2、配置示例

* 作为纯客户端使用

```java
gritclient:
  server: "http://localhost:8081"
  token: "B6uWZDYUm4kMscdEAERXQ2wMBW1nLL0j"
```

* 与服务端同体使用

不需要配置。自动转为 jdbc 模式


### 3、代码示例

* 登录

```java
@Controller
public class LoginController {
    @Mapping("login")
    public Result login(String username, String password) throws Exception {
        Subject subject = GritClient.global().auth().login(username, password);

        if (subject == null || subject.subject_id == 0) {
            return Result.failure();
        } else {
            return Result.succeed(subject);
        }
    }
}
```

* 鉴权配置（支持 solon-auth 接口规范）

```java
public class AuthProcessorImpl extends GritAuthProcessor {
    @Override
    protected long getSubjectId() {
        return Context.current().sessionAsLong("user_id");
    }
}


@Configuration
public class AutoConfig {
    @Bean
    public AuthAdapter init() {
        return new AuthAdapter()
                .loginUrl("/login") //设定登录地址，未登录时自动跳转
                .addRule(r -> r.include("**").verifyIp().failure((c, t) -> c.output("你的IP不在白名单"))) //添加规则
                .addRule(b -> b.exclude("/login**").exclude("/_**").verifyPath()) //添加规则
                .processor(new AuthProcessorImpl()); //设定认证处理器
    }
}
```

* 构建菜单数据

```java
List<ResourceGroup> groupList = GritClient.global().auth().getUriGroupList(subjectId);

for (ResourceGroup group : groupList) {
    ResourceEntity res = GritClient.global().auth().getUriFristByGroup(subjectId, group.resource_id);

    if (Utils.isEmpty(res.link_uri) == false) {
         //res...
    }
}
```

### 具体示例

* https://gitee.com/noear/grit/tree/main/example/example1-client
* https://gitee.com/noear/grit/tree/main/example/example2-client
