【auth】更新权限校验和token校验的逻辑,一部分业务抽出来放到了项目的拦截器

pull/3/head
fengshuonan 2020-12-18 11:04:25 +08:00
parent 08c07dd981
commit caf0fd9746
3 changed files with 22 additions and 38 deletions

View File

@ -75,7 +75,7 @@ public interface AuthServiceApi {
* <p> * <p>
* token * token
* <p> * <p>
* sessionsessionsessionjwt * sessionsessionsessionjwt
* *
* @param token token * @param token token
* @param requestUrl url * @param requestUrl url

View File

@ -15,8 +15,6 @@ import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext; import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext;
import cn.stylefeng.roses.kernel.jwt.api.exception.JwtException; import cn.stylefeng.roses.kernel.jwt.api.exception.JwtException;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload; import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.resource.api.pojo.resource.ResourceDefinition;
import cn.stylefeng.roses.kernel.resource.api.pojo.resource.ResourceUrlParam;
import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil; import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil;
import cn.stylefeng.roses.kernel.system.ResourceServiceApi; import cn.stylefeng.roses.kernel.system.ResourceServiceApi;
import cn.stylefeng.roses.kernel.system.UserServiceApi; import cn.stylefeng.roses.kernel.system.UserServiceApi;
@ -91,35 +89,28 @@ public class AuthServiceImpl implements AuthServiceApi {
@Override @Override
public void checkAuth(String token, String requestUrl) { public void checkAuth(String token, String requestUrl) {
// 1. 获取url对应的资源信息ResourceDefinition // 1. 校验token是否传参
ResourceUrlParam resourceUrlReq = new ResourceUrlParam(); if (StrUtil.isEmpty(token)) {
resourceUrlReq.setUrl(requestUrl); throw new AuthException(AuthExceptionEnum.TOKEN_GET_ERROR);
ResourceDefinition resourceDefinition = resourceServiceApi.getResourceByUrl(resourceUrlReq);
// 2. 如果此接口不需要权限校验或者查询到资源为空,则放开过滤
if (resourceDefinition == null || !resourceDefinition.getRequiredLogin()) {
return;
} }
// 3. 如果当前接口需要鉴权则校验用户token是否正确校验失败会抛出异常 // 2. 校验用户token是否正确校验失败会抛出异常
if (resourceDefinition.getRequiredLogin()) {
this.validateToken(token); this.validateToken(token);
}
// 4. 如果token校验通过获取token的payload以及是否开启了记住我功能 // 3. 如果token校验通过获取token的payload以及是否开启了记住我功能
DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token); DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token);
Boolean rememberMe = defaultPayload.getRememberMe(); Boolean rememberMe = defaultPayload.getRememberMe();
// 5. 获取用户的当前会话信息 // 4. 获取用户的当前会话信息
LoginUser loginUser = sessionManagerApi.getSession(token); LoginUser loginUser = sessionManagerApi.getSession(token);
// 6. 如果开了记住我,但是会话为空,则创建一次会话信息 // 5. 如果开了记住我,但是会话为空,则创建一次会话信息
if (rememberMe && loginUser == null) { if (rememberMe && loginUser == null) {
UserLoginInfoDTO userLoginInfo = userServiceApi.getUserLoginInfo(defaultPayload.getAccount()); UserLoginInfoDTO userLoginInfo = userServiceApi.getUserLoginInfo(defaultPayload.getAccount());
sessionManagerApi.createSession(token, userLoginInfo.getLoginUser()); sessionManagerApi.createSession(token, userLoginInfo.getLoginUser());
} }
// 7. 如果会话信息为空,则判定此次校验失败 // 6. 如果会话信息为空,则判定此次校验失败
if (loginUser == null) { if (loginUser == null) {
throw new AuthException(AuthExceptionEnum.AUTH_ERROR); throw new AuthException(AuthExceptionEnum.AUTH_ERROR);
} }

View File

@ -1,11 +1,11 @@
package cn.stylefeng.roses.kernel.auth.permission; package cn.stylefeng.roses.kernel.auth.permission;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.auth.api.PermissionServiceApi; import cn.stylefeng.roses.kernel.auth.api.PermissionServiceApi;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi; import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException; import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser; import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.resource.api.pojo.resource.ResourceDefinition;
import cn.stylefeng.roses.kernel.resource.api.pojo.resource.ResourceUrlParam;
import cn.stylefeng.roses.kernel.system.ResourceServiceApi; import cn.stylefeng.roses.kernel.system.ResourceServiceApi;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -33,24 +33,18 @@ public class PermissionServiceImpl implements PermissionServiceApi {
@Override @Override
public void checkPermission(String token, String requestUrl) { public void checkPermission(String token, String requestUrl) {
// 1. 获取url对应的资源信息ResourceDefinition // 1. 校验token是否传参
ResourceUrlParam resourceUrlReq = new ResourceUrlParam(); if (StrUtil.isEmpty(token)) {
resourceUrlReq.setUrl(requestUrl); throw new AuthException(AuthExceptionEnum.TOKEN_GET_ERROR);
ResourceDefinition resourceDefinition = resourceServiceApi.getResourceByUrl(resourceUrlReq);
// 2. 如果此接口不需要权限校验或者查询到资源为空,则放开过滤
if (resourceDefinition == null || !resourceDefinition.getRequiredPermission()) {
return;
} }
// 3. 获取token对应的用户信息 // 2. 获取token对应的用户信息
LoginUser session = sessionManagerApi.getSession(token); LoginUser session = sessionManagerApi.getSession(token);
if (session == null) { if (session == null) {
throw new AuthException(TOKEN_ERROR); throw new AuthException(TOKEN_ERROR);
} }
// 4. 如果需要权限认证验证用户有没有当前url的权限 // 3. 验证用户有没有当前url的权限
if (resourceDefinition.getRequiredPermission()) {
Set<String> resourceUrls = session.getResourceUrls(); Set<String> resourceUrls = session.getResourceUrls();
if (resourceUrls == null || resourceUrls.size() == 0) { if (resourceUrls == null || resourceUrls.size() == 0) {
throw new AuthException(PERMISSION_RES_VALIDATE_ERROR); throw new AuthException(PERMISSION_RES_VALIDATE_ERROR);
@ -60,6 +54,5 @@ public class PermissionServiceImpl implements PermissionServiceApi {
} }
} }
} }
}
} }