登录认证
登录认证处理类为 easy-platform-base-security 下的 AuthAction.java
1.数据库表
主视图
v_global_auth_user
sql
CREATE VIEW v_global_auth_user AS
SELECT
a.id AS id,
a.USER_NAME AS user_name,
a.USER_CODE AS user_code,
a.PASSWORD AS PASSWORD,
a.LABOR AS labor,
a.USER_TYPE AS user_type,
a.PHONE AS mobile_phone,
a.STATUS AS STATUS,
a.VALID_DATE AS valid_date,
a.CUST_ID AS cust_id,
a.main_dept_id AS dept_id,
a.avatar_img AS avatar_img,
a.CREATE_USER_ID AS create_user_id,
a.CREATE_TIME AS create_time,
a.update_user_id AS update_user_id,
a.update_time AS update_time,
a.deleted AS deleted
FROM
es_sysuser AS a
UNION
SELECT
a.id AS id,
a.USER_NAME AS user_name,
NULL AS user_code,
NULL AS PASSWORD,
a.LABOR AS labor,
'1' AS user_type,
a.MOBILE_PHONE AS MOBILE_PHONE,
'1' AS STATUS,
NULL AS valid_date,
a.cust_id AS cust_id,
a.MAIN_DEPT_ID AS dept_id,
'' AS avatar_img,
a.CREATE_USER_ID AS create_user_id,
a.CREATE_TIME AS create_time,
a.update_user_id AS update_user_id,
a.update_time AS update_time,
a.deleted AS deleted
FROM
es_org_user a
WHERE NOT EXISTS
(SELECT
1
FROM
es_sysuser b WHERE a.id = b.id)关联表
es_sysuser、es_org_user
2.认证逻辑解析
java
@PostMapping("/form")
@ResponseBody
public CommonResult<Object> passwordLogin(@RequestBody @Validated AuthFormRequest request, String device)
throws Exception {
/**根据登录时输入的用户账号从视图v_global_auth_user中查询用户 */
AuthUserVo authUser = userDetailsService.loadUserFromDb(request.getUsername());
/**用户在视图v_global_auth_user中存在 */
if (null != authUser) {
/**获取登录时输入的密码 */
String password = request.getPassword();
/**检查登录失败次数是否大于配置文件中的最大登录失败次数,默认为5 */
if (AuthHandlerFactory.getInstance().getService().checkLoginFailLimit(authUser.getId())) {
return CommonResult.failed(30008);
}
/**输入的密码是否正确 */
else if (userDetailsService.isRightPassword(password,authUser.getPassword())) {
if (EbaseStringUtil.isNotBlank(device)) {
StpUtil.login(authUser.getId(), device);
} else {
StpUtil.login(authUser.getId());
}
/**用户信息缓存到Redis */
userCacheService.addCache(authUser);
/**用户角色、权限信息缓存到Redis */
userPermissionCacheService.addCache(authUser.getId());
/**封装返回到前端的token */
JSONObject data = new JSONObject();
data.put("token", StpUtil.getTokenValue());
data.put("tokenObject", StpUtil.getTokenInfo());
data.put("accessToken", StpUtil.getTokenValue());
data.put("expires", 0);
/**返回token */
return CommonResult.success(30000, data);
} else {
Boolean locked = AuthHandlerFactory.getInstance().getService().loginLog(authUser.getId(), device,
BaseCoreConstant.LOGIN_FAIL);
if (locked) {
/**登录异常,用户密码尝试超出次数限定,请联系管理员解锁,错误代码含义见message.properties */
return CommonResult.failed(30008);
} else {
/**登录异常,用户密码错误 */
return CommonResult.failed(30006);
}
}
} else {
return CommonResult.failed(30001);
}
}