```xml
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-security-auth</artifactId>
</dependency>
```

#### 1、描述

安全扩展插件，为 Solon Auth 提供公共的鉴权接口及应用配置对接。

* 可以直接使用，与业务权限接口适配对接
* 也可通过适配，为其它鉴权插件提供公共的注解、模板标签、基于路径的多账号体系支持。


#### 2、使用示例

* 适配鉴权处理接口（AuthProcessor）

```java
public class AuthProcessorImpl implements AuthProcessor {
    @Override
    public boolean verifyIp(String ip) {
        return false;
    }

    @Override
    public boolean verifyLogined() {
        return false;
    }

    @Override
    public boolean verifyPath(String path, String method) {
        return false;
    }

    @Override
    public boolean verifyPermissions(String[] permissions, Logical logical) {
        return false;
    }

    @Override
    public boolean verifyRoles(String[] roles, Logical logical) {
        return false;
    }
}
```

* 定制鉴权适配器和失败处理（其中 addRule 可以没有）

使用时“规则”、“注解”、“模板标鉴”必须要有一样，它们才会触发鉴权。

```java
//构建适配器
@Configuration
public class Config {
    @Bean(index = 0) //如果与别的过滤器冲突，可以按需调整顺序位
    public AuthAdapter adapter() {
        return new AuthAdapter()
                .loginUrl("/login") //设定登录地址，未登录时自动跳转
                .addRule(r -> r.include("**").verifyIp().failure((c, t) -> c.output("你的IP不在白名单"))) //添加规则
                .addRule(b -> b.exclude("/login**").exclude("/_run/**").verifyPath()) //添加规则
                .processor(new AuthProcessorImpl()); //设定认证处理器
    }
}

//验证失败处理
@Component
public class DemoFilter implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        try {
            chain.doFilter(ctx);
        } catch (AuthException e) {
            AuthStatus status = e.getStatus();
            ctx.render(Result.failure(status.code, status.message));
        }
    }
}
```

* 使用注解控制权限

```java
@Mapping("/demo/agroup")
@Controller
public class AgroupController extends BaseController {
    @Mapping("")
    public void home() {
        //agroup 首页
    }

    @AuthPermissions("agroup:edit")
    @Mapping("edit/{id}")
    public void edit(int id) {
        //编辑显示页，需要编辑权限
    }

    @AuthRoles("admin")
    @Mapping("edit/{id}/ajax/save")
    public void save(int id) {
        //编辑处理接口，需要管理员权限
    }
}
```

* 使用模板标鉴控制权限（支持所有已适配的后端模板）


关于模板标鉴控制权限的示例，可参考[https://gitee.com/noear/solon_auth_demo](https://gitee.com/noear/solon_auth_demo)

```html
<div>
  <@authPermissions name="user:del">
  我有user:del权限
  </@authPermissions>

  <@authRoles name="admin">
  我有admin角色
  </@authRoles>
</div>
```

#### 3、多套账号体系鉴权

多账号体系鉴权，常见的应用场景：在一个系统里面，前台用户鉴权与后台管理鉴权是两套东西，且又在一起的。


比如：后台管理域为：`/admin/` 路径段；其它为前台用户路径段：`/`（即默认）。

```java
//用户模块
@Configuration
public class Config {
    @Bean(index = 1)
    public AuthAdapter userAuth(){
        return  new AuthAdapter()
                .pathPrefix("/")
                .loginUrl("/login") //设定登录地址，未登录时自动跳转
                .addRule(b -> b.exclude("/login**").exclude("/_run/**").exclude("/admin/**").verifyPath()) //添加规则
                .processor(new UserAuthProcessorImpl()); //设定认证处理器
    }
    
    @Bean(index = 0)
    public AuthAdapter adminAuth(){
        return new AuthAdapter()
                .pathPrefix("/admin/") //注意这个路径前缀限制
                .loginUrl("/admin/login") //设定登录地址，未登录时自动跳转
                .addRule(r -> r.include("/admin/**").verifyIp().failure((c, t) -> c.output("你的IP不在白名单"))) //添加规则
                .addRule(b -> b.include("/admin/**").exclude("/admin/login**").verifyPath()) //添加规则
                .processor(new AdminAuthProcessorImpl()); //设定认证处理器
    }
}
```

#### 4、更多参考

具体可参考：[《学习/Solon Web 开发/Web 鉴权》](/article/59)





