mirror of https://gitee.com/stylefeng/roses
【auth】更新权限校验和token校验的逻辑,一部分业务抽出来放到了项目的拦截器
parent
08c07dd981
commit
caf0fd9746
|
@ -75,7 +75,7 @@ public interface AuthServiceApi {
|
||||||
* <p>
|
* <p>
|
||||||
* 第一,校验用户的token是否过期
|
* 第一,校验用户的token是否过期
|
||||||
* <p>
|
* <p>
|
||||||
* 第二,校验用户的session是否失效,但是记住我的session失效后会自动创建session,之道jwt失效后
|
* 第二,校验用户的session是否失效,但是记住我的session失效后会自动创建session,直到jwt失效后
|
||||||
*
|
*
|
||||||
* @param token 用户登陆的token
|
* @param token 用户登陆的token
|
||||||
* @param requestUrl 被校验的url
|
* @param requestUrl 被校验的url
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue