Solon

solon.auth

v2.5.6 native </> json </> markdown
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon.auth</artifactId>
</dependency>

1、描述

基础扩展插件,为 Solon Auth 提供公共的鉴权接口及应用配置对接。

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

2、使用示例

  • 适配鉴权处理接口(AuthProcessor)
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 可以没有)
@Configuration
public class Config {
    @Bean
    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()) //设定认证处理器
                .failure((ctx, rst) -> { 
                    ctx.render(rst);  //设定默认的验证失败处理;也可以用过滤器捕促异常
                });
    }
}

//或者:使用过滤器,替代“默认的验证失败处理”
@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));
        }
    }
}
  • 使用注解控制权限
@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

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

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

3、多套账号体系鉴权

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

  • 多套账号体系鉴权时,可以取消默认的 AuthAdapter 配置
@Configuration
public class Config {
    @Bean
    public AuthAdapter adapter() { //可以取消默认的,也可以保留。
        return ...;
    }
}
  • 为需要的路径段添加 AuthAdapterSupplier 组件。

比如:后台管理域为:/admin/ 路径段;其它为用户路径段。


//用户模块
@Component
public class UserAuthAdapterSupplierImpl implements AuthAdapterSupplier{
    final AuthAdapter userAuth;

    public UserAuthAdapterSupplierImpl(){
        userAuth = new AuthAdapter()
                .loginUrl("/login") //设定登录地址,未登录时自动跳转
                .addRule(b -> b.exclude("/login**").exclude("/_run/**").exclude("/admin/**").verifyPath()) //添加规则
                .processor(new UserAuthProcessorImpl()) //设定认证处理器
                .failure((ctx, rst) -> { //设定默认的验证失败处理
                    ctx.render(rst);
                });
    }

    @Override
    public String pathPrefix() {
        return "/"; //相当于所有 / 开头的路都是。但在匹配时,会先匹配长的pathPrefix匹配。
    }

    public AuthAdapter adapter(){
        return userAuth;
    }
}

//管理模块
@Component
public class AdminAuthAdapterSupplierImpl implements AuthAdapterSupplier{
    final AuthAdapter adminAuth;

    public AdminAuthAdapterSupplierImpl(){
        adminAuth = new AuthAdapter()
                .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()) //设定认证处理器
                .failure((ctx, rst) -> { //设定默认的验证失败处理
                    ctx.render(rst);
                });
    }

    @Override
    public String pathPrefix() {
        return "/admin/";
    }

    public AuthAdapter adapter(){
        return adminAuth;
    }
}

4、更多参考

具体可参考:《学习/Solon Web 开发/Web 鉴权》