后端开发
登录扩展

登录扩展

平台默认登录逻辑是基于系统数据库 a_sys_user 表的,如果你的系统用户信息来自其他系统,那么你需要自己实现登录逻辑,系统会在调用默认登录 不通过 后再调用扩展登录,如果扩展登录也不通过则登录失败。

平台登录逻辑

平台默认逻辑如代码所示 (所在包:product,实现类:com.yonyouaud.ais.service.impl.ManageServiceImpl)

public UserInfo login(String username, String password, String tenantId) {
        UserInfo result = userService.login(username, password, tenantId);
        if (result == null) { // 默认认证逻辑不通过,查找是否有其他登录逻辑
            result = loginActionsHandler(username, password, tenantId);
            if (result != null) {
                Utils.setUserInfoCache(result.getUserId(), result); // 如果是特殊登录逻辑,需要将用户信息缓存起来,这里后续也可以序列化到redis中或数据表中
            }
        }
        return result;
    }

核心的方法 loginActionsHandler 是脚本化环境,会从 a_prod_groovyscripts 数据表中查找 scripttype=LoginAction 的记录,并执行其 Groovy 脚本, 脚本中需要实现 com.yonyouaud.commons.user.LoginAction 接口,接口中有一个 login 方法,该方法的返回值是 UserInfo 对象,如果返回 null 则表示登录失败,否则登录成功。

public interface LoginAction {
    UserInfo login(String username, String password, String tenantId);
}

扩展登录逻辑

操作路径: 开放平台 -> 后端脚本 新增后端 Groovy 脚本,编写脚本实现 com.yonyouaud.commons.user.LoginAction 接口,如下所示:

import com.yonyouaud.commons.user.LoginAction
import com.yonyouaud.commons.user.UserInfo
 
class MyLoginAction implements LoginAction {
    @Override
    UserInfo login(String username, String password, String tenantId) {
        return new UserInfo(userId: '1', userName: 'admin', nickName: '管理员', role: [new RoleInfo(id: '1', roleName: '管理员', description: '管理员', groupId: '1')])
    }
}

其中类 UserInfoRoleInfo 的定义如下:

public class UserInfo {
    private String userId;
    private String userName;
    private String nickName;
    private String token;
    private String groupId;
    private String avatarUrl;
    private List<RoleInfo> role;
 
    //...
}
 
public class RoleInfo {
    private String id;
    private String roleName;
    private String description;
    private String groupId;
 
    //...
}