基于vertx-auth-common和resuful api的vertx动态权限认证框架
适用场景:用户登陆后动态从数据库或其他介质中获取权限信息
1.提供SimpleAuthProvider接口实现(provide a implement of SimpleAuthProvider)
public class MyAuthProviderImpl implements SimpleAuthProvider {
/**
*
* @param authInfo 用户登录时提交的验证信息
* @param resultHandler 处理用户验证结果
* 验证成功,创建SimpleAuthUser对象(该对象中包含用户权限信息)交由resultHandler处理
* 验证失败,自定义包含失败原因的异常,交由resultHandler处理
*/
public void authenticate(JsonObject authInfo, Handler> resultHandler) {
/** for example:
if(authInfo is right){
SimpleAuthUser user = new SimpleAuthUser();
user.setAuthProvider(this);
user.setPrincipal(...);
user.appendPermissions(...);
resultHandler.handle(Future.succeededFuture(user));
}else{
resultHandler.handle(Future.failedFuture(a Throwable));
}
*/
}
}
2.配置router(config the Router)
// 创建配置类
SimpleAuthOptions options = new SimpleAuthOptions();
// 定义不需要拦截的访问
List annoPermissions = listOf("GET:/articles/page","GET:/articleClassifies/tree")
options.setAnnoPermissions(annoPermissions);
// 创建并注册权限处理器
SimpleAuthHandler authHandler = SimpleAuthHandler.create(this.vertx,new myAuthProviderImpl(),options);
router.route().handler(authHandler);
3.用户登录(user login)
Subject subject = SubjectUtil.getSubject(routingContext);
subject.login(context,params, res -> {
if(res.succeeded()){
context.response().write(...);
}else{
context.response().write(...);
}
context.end();
});
4.获取Subject实体(get the subject of user)
Subject subject = SubjectUtil.getSubject(routingContext);
4.注意
在vertx-auth-simple中,默认的权限字符串生成格式为 "请求方法:请求地址",如 "GET:/articles/page" ,
同时,默认的权限字符串处理策略对静态资源文件进行了处理,允许访问静态资源(具体实现可查看DefaultPermissionStrategyImpl.class) ,
所以可以放心地将SimpleAuthHandler声明在静态资源处理器StaticHandler之前
5.扩展功能
下面所有扩展接口在vertx-auth-simple中都提供了默认实现(可零配置开箱即用),可以根据场景需要来自定义各个接口实现
1> 实现PermissionStrategy接口,自定义权限字符串的生成格式和校验规则
SimpleAuthOptions options = new SimpleAuthOptions();
options.setPermissionStrategy(new MyPermissionStrategyImpl());
2> 实现SessionIdStrategy接口,自定义sessionId处理策略
SimpleAuthOptions options = new SimpleAuthOptions();
options.setSessionIdStrategy(new MySessionIdStrategyImpl());
3> 实现SessionPersistStrategy接口,自定义session持久化方式
SimpleAuthOptions options = new SimpleAuthOptions();
options.setSessionPersistStrategy(new MySessionPersistStrategyImpl());
4> 实现RememberMePersistStrategy接口,自定义rememberMe信息的持久化方式
SimpleAuthOptions options = new SimpleAuthOptions();
options.setRememberMePersistStrategy(new MyRememberMePersistStrategyImpl());
5> 实现RealmStrategy接口,自定义权限验证成功或者失败后的处理动作
SimpleAuthOptions options = new SimpleAuthOptions();
options.setRealmStrategy(new MyRealmStrategyImpl());