Merge branch 'develop' of https://github.com/dibo-software/diboot-v2 into develop

This commit is contained in:
wuy 2020-06-29 10:10:54 +08:00
commit 59265cdc2d
25 changed files with 239 additions and 188 deletions

View File

@ -48,7 +48,7 @@ public @interface BindQuery {
Class entity() default NullType.class; Class entity() default NullType.class;
/*** /***
* JOIN连接条件 * JOIN连接条件支持动态的跨表JOIN查询
* @return * @return
*/ */
String condition() default ""; String condition() default "";

View File

@ -65,7 +65,15 @@ public class Cons {
/** /**
* 创建时间字段 * 创建时间字段
*/ */
createTime createTime,
/**
* 更新时间
*/
updateTime,
/**
* 创建人
*/
createBy
} }
} }

View File

@ -50,7 +50,7 @@ public class BaseController {
if(entityOrDto instanceof HttpServletRequest){ if(entityOrDto instanceof HttpServletRequest){
throw new Exception("参数错误buildQueryWrapper()参数为Entity/DTO对象"); throw new Exception("参数错误buildQueryWrapper()参数为Entity/DTO对象");
} }
return QueryBuilder.toQueryWrapper(entityOrDto, extractParams()); return QueryBuilder.toQueryWrapper(entityOrDto, extractQueryParams());
} }
/*** /***
@ -62,7 +62,7 @@ public class BaseController {
if(entityOrDto instanceof HttpServletRequest){ if(entityOrDto instanceof HttpServletRequest){
throw new Exception("参数错误buildQueryWrapper()参数为Entity/DTO对象"); throw new Exception("参数错误buildQueryWrapper()参数为Entity/DTO对象");
} }
return QueryBuilder.toLambdaQueryWrapper(entityOrDto, extractParams()); return QueryBuilder.toLambdaQueryWrapper(entityOrDto, extractQueryParams());
} }
/*** /***
@ -124,7 +124,7 @@ public class BaseController {
* 提取请求参数名集合 * 提取请求参数名集合
* @return * @return
*/ */
private Set<String> extractParams(){ protected Set<String> extractQueryParams(){
Map<String, Object> paramValueMap = convertParams2Map(); Map<String, Object> paramValueMap = convertParams2Map();
if(V.notEmpty(paramValueMap)){ if(V.notEmpty(paramValueMap)){
return paramValueMap.keySet(); return paramValueMap.keySet();
@ -136,7 +136,7 @@ public class BaseController {
* 将请求参数值转换为Map * 将请求参数值转换为Map
* @return * @return
*/ */
public Map<String, Object> convertParams2Map(){ protected Map<String, Object> convertParams2Map(){
Map<String, Object> result = new HashMap<>(8); Map<String, Object> result = new HashMap<>(8);
if(request == null){ if(request == null){
return result; return result;
@ -196,7 +196,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public Long getLong(String param){ protected Long getLong(String param){
return S.toLong(request.getParameter(param)); return S.toLong(request.getParameter(param));
} }
@ -206,7 +206,7 @@ public class BaseController {
* @param defaultValue * @param defaultValue
* @return * @return
*/ */
public long getLong(String param, Long defaultValue){ protected long getLong(String param, Long defaultValue){
return S.toLong(request.getParameter(param), defaultValue); return S.toLong(request.getParameter(param), defaultValue);
} }
@ -215,7 +215,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public Integer getInteger(String param){ protected Integer getInteger(String param){
return S.toInt(request.getParameter(param)); return S.toInt(request.getParameter(param));
} }
@ -225,7 +225,7 @@ public class BaseController {
* @param defaultValue * @param defaultValue
* @return * @return
*/ */
public int getInt(String param, Integer defaultValue){ protected int getInt(String param, Integer defaultValue){
return S.toInt(request.getParameter(param), defaultValue); return S.toInt(request.getParameter(param), defaultValue);
} }
@ -234,7 +234,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public boolean getBoolean(String param){ protected boolean getBoolean(String param){
return S.toBoolean(request.getParameter(param)); return S.toBoolean(request.getParameter(param));
} }
@ -244,7 +244,7 @@ public class BaseController {
* @param defaultBoolean * @param defaultBoolean
* @return * @return
*/ */
public boolean getBoolean(String param, boolean defaultBoolean){ protected boolean getBoolean(String param, boolean defaultBoolean){
return S.toBoolean(request.getParameter(param), defaultBoolean); return S.toBoolean(request.getParameter(param), defaultBoolean);
} }
@ -253,7 +253,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public Double getDouble(String param){ protected Double getDouble(String param){
if(V.notEmpty(request.getParameter(param))){ if(V.notEmpty(request.getParameter(param))){
return Double.parseDouble(request.getParameter(param)); return Double.parseDouble(request.getParameter(param));
} }
@ -266,7 +266,7 @@ public class BaseController {
* @param defaultValue * @param defaultValue
* @return * @return
*/ */
public Double getDouble(String param, Double defaultValue){ protected Double getDouble(String param, Double defaultValue){
if(V.notEmpty(request.getParameter(param))){ if(V.notEmpty(request.getParameter(param))){
return Double.parseDouble(request.getParameter(param)); return Double.parseDouble(request.getParameter(param));
} }
@ -278,7 +278,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public String getString(String param){ protected String getString(String param){
if(V.notEmpty(request.getParameter(param))){ if(V.notEmpty(request.getParameter(param))){
return request.getParameter(param); return request.getParameter(param);
} }
@ -291,7 +291,7 @@ public class BaseController {
* @param defaultValue * @param defaultValue
* @return * @return
*/ */
public String getString(String param, String defaultValue){ protected String getString(String param, String defaultValue){
if(V.notEmpty(request.getParameter(param))){ if(V.notEmpty(request.getParameter(param))){
return request.getParameter(param); return request.getParameter(param);
} }
@ -303,7 +303,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public String[] getStringArray(String param){ protected String[] getStringArray(String param){
if(request.getParameterValues(param) != null){ if(request.getParameterValues(param) != null){
return request.getParameterValues(param); return request.getParameterValues(param);
} }
@ -315,7 +315,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public List<String> getStringList(String param){ protected List<String> getStringList(String param){
String[] strArray = getStringArray(param); String[] strArray = getStringArray(param);
if(V.isEmpty(strArray)){ if(V.isEmpty(strArray)){
return null; return null;
@ -328,7 +328,7 @@ public class BaseController {
* @param param * @param param
* @return * @return
*/ */
public List<Long> getLongList(String param){ protected List<Long> getLongList(String param){
String[] strArray = getStringArray(param); String[] strArray = getStringArray(param);
if(V.isEmpty(strArray)){ if(V.isEmpty(strArray)){
return null; return null;

View File

@ -78,9 +78,21 @@ public class BaseServiceImpl<M extends BaseCrudMapper<T>, T> extends ServiceImpl
warning("createEntity", "参数entity为null"); warning("createEntity", "参数entity为null");
return false; return false;
} }
return save(entity);
}
@Override
public boolean save(T entity) {
beforeCreateEntity(entity);
return super.save(entity); return super.save(entity);
} }
/**
* 用于创建之前的自动填充等场景调用
*/
protected void beforeCreateEntity(T entity){
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public <RE, R> boolean createEntityAndRelatedEntities(T entity, List<RE> relatedEntities, ISetter<RE, R> relatedEntitySetter) { public <RE, R> boolean createEntityAndRelatedEntities(T entity, List<RE> relatedEntities, ISetter<RE, R> relatedEntitySetter) {
@ -130,7 +142,26 @@ public class BaseServiceImpl<M extends BaseCrudMapper<T>, T> extends ServiceImpl
} }
else{ else{
// 批量插入 // 批量插入
return super.saveBatch(entityList, BaseConfig.getBatchSize()); return saveBatch(entityList, BaseConfig.getBatchSize());
}
}
@Override
public boolean saveBatch(Collection<T> entityList, int batchSize){
// 批量插入
beforeCreateEntities(entityList);
return super.saveBatch(entityList, batchSize);
}
/**
* 用于创建之前的自动填充等场景调用
*/
protected void beforeCreateEntities(Collection<T> entityList){
if(V.isEmpty(entityList)){
return;
}
for(T entity : entityList){
beforeCreateEntity(entity);
} }
} }
@ -649,7 +680,7 @@ public class BaseServiceImpl<M extends BaseCrudMapper<T>, T> extends ServiceImpl
* @param message * @param message
*/ */
private void warning(String method, String message){ private void warning(String method, String message){
log.warn(this.getClass().getName() + ".{} 调用错误: {}, 请检查!", method, message); log.warn(this.getClass().getSimpleName() + ".{} 调用错误: {}, 请检查!", method, message);
} }
} }

View File

@ -161,8 +161,14 @@ public class BeanUtils {
* @return * @return
*/ */
public static Object getProperty(Object obj, String field){ public static Object getProperty(Object obj, String field){
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(obj); try {
return wrapper.getPropertyValue(field); BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(obj);
return wrapper.getPropertyValue(field);
}
catch (Exception e) {
log.warn("获取对象属性值出错返回null", e);
}
return null;
} }
/*** /***

View File

@ -17,7 +17,7 @@ compile("com.diboot:diboot-file-spring-boot-starter:{latestVersion}")
diboot-file会自动依赖以下jar包无需重复引入 diboot-file会自动依赖以下jar包无需重复引入
* commons-fileupload: 1.4 * commons-fileupload: 1.4
* easyexcel:2.x * easyexcel:2.x
* okhttp:4.3.x * okhttp:4.7.x
* thumbnailator: 0.4.9 (图片压缩,不需要可剔除) * thumbnailator: 0.4.9 (图片压缩,不需要可剔除)
* easy-captcha: 1.6.x (验证码,不需要可剔除) * easy-captcha: 1.6.x (验证码,不需要可剔除)

View File

@ -60,7 +60,7 @@ public void addFormatters(FormatterRegistry registry) {
* v2.1.x版本开始extdata扩展字段将不再推荐使用该字段设计目的用于字段冗余的json存储可以通过数据库的json数据类型实现。 * v2.1.x版本开始extdata扩展字段将不再推荐使用该字段设计目的用于字段冗余的json存储可以通过数据库的json数据类型实现。
devtools从2.1版本开始不再支持extdata的特殊处理。 devtools从2.1版本开始不再支持extdata的特殊处理。
* v2.1.x版本依赖组件升级为: Spring Boot 2.3.0Mybatis-Plus 3.3.2fastjson 1.2.70。根据您的依赖情况,可能会有依赖冲突需要解决。 * v2.1.x版本依赖组件升级为: Spring Boot 2.3.xMybatis-Plus 3.3.xfastjson 1.2.7x。根据您的依赖情况,可能会有依赖冲突需要解决。
#### 2. diboot-devtools #### 2. diboot-devtools
* v2.1版本开始,配置参数: * v2.1版本开始,配置参数:

View File

@ -38,13 +38,13 @@
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
<version>2.2.3</version> <version>2.2.6</version>
</dependency> </dependency>
<!-- http --> <!-- http -->
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
<version>4.5.0</version> <version>4.7.2</version>
</dependency> </dependency>
<!-- 图片压缩 --> <!-- 图片压缩 -->
<dependency> <dependency>
@ -57,7 +57,6 @@
<groupId>com.github.whvcse</groupId> <groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId> <artifactId>easy-captcha</artifactId>
<version>1.6.2</version> <version>1.6.2</version>
<scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -30,7 +30,7 @@
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
<version>4.5.0</version> <version>4.7.2</version>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>

View File

@ -15,13 +15,13 @@
*/ */
package com.diboot.iam.annotation.process; package com.diboot.iam.annotation.process;
import com.diboot.core.util.BeanUtils;
import com.diboot.core.util.ContextHelper; import com.diboot.core.util.ContextHelper;
import com.diboot.core.util.S; import com.diboot.core.util.S;
import com.diboot.core.util.V; import com.diboot.core.util.V;
import com.diboot.iam.annotation.BindPermission; import com.diboot.iam.annotation.BindPermission;
import com.diboot.iam.config.Cons; import com.diboot.iam.config.Cons;
import com.diboot.iam.util.AnnotationUtils; import com.diboot.iam.util.AnnotationUtils;
import com.diboot.iam.util.BeanUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.aop.support.AopUtils; import org.springframework.aop.support.AopUtils;

View File

@ -15,6 +15,7 @@
*/ */
package com.diboot.iam.auth; package com.diboot.iam.auth;
import com.diboot.core.vo.KeyValue;
import com.diboot.iam.entity.IamRole; import com.diboot.iam.entity.IamRole;
import java.util.List; import java.util.List;
@ -33,7 +34,7 @@ public interface IamExtensible {
* @param userId * @param userId
* @return * @return
*/ */
Object getUserExtentionObj(String userType, Long userId); KeyValue getUserExtentionObj(String userType, Long userId);
/** /**
* 获取可扩展的角色 * 获取可扩展的角色

View File

@ -22,12 +22,12 @@ import com.diboot.core.vo.Status;
import com.diboot.iam.auth.AuthService; import com.diboot.iam.auth.AuthService;
import com.diboot.iam.config.Cons; import com.diboot.iam.config.Cons;
import com.diboot.iam.dto.AuthCredential; import com.diboot.iam.dto.AuthCredential;
import com.diboot.iam.entity.BaseLoginUser;
import com.diboot.iam.entity.IamAccount; import com.diboot.iam.entity.IamAccount;
import com.diboot.iam.entity.IamLoginTrace; import com.diboot.iam.entity.IamLoginTrace;
import com.diboot.iam.jwt.BaseJwtAuthToken; import com.diboot.iam.jwt.BaseJwtAuthToken;
import com.diboot.iam.service.IamAccountService; import com.diboot.iam.service.IamAccountService;
import com.diboot.iam.service.IamLoginTraceService; import com.diboot.iam.service.IamLoginTraceService;
import com.diboot.iam.util.BeanUtils;
import com.diboot.iam.util.IamSecurityUtils; import com.diboot.iam.util.IamSecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
@ -144,10 +144,9 @@ public class PwdAuthServiceImpl implements AuthService {
protected void saveLoginTrace(BaseJwtAuthToken authToken, boolean isSuccess){ protected void saveLoginTrace(BaseJwtAuthToken authToken, boolean isSuccess){
IamLoginTrace loginTrace = new IamLoginTrace(); IamLoginTrace loginTrace = new IamLoginTrace();
loginTrace.setAuthType(getAuthType()).setAuthAccount(authToken.getAuthAccount()).setUserType(authToken.getUserType()).setSuccess(isSuccess); loginTrace.setAuthType(getAuthType()).setAuthAccount(authToken.getAuthAccount()).setUserType(authToken.getUserType()).setSuccess(isSuccess);
Object currentUser = IamSecurityUtils.getCurrentUser(); BaseLoginUser currentUser = IamSecurityUtils.getCurrentUser();
if(currentUser != null){ if(currentUser != null){
Long userId = (Long) BeanUtils.getProperty(currentUser, Cons.FieldName.id.name()); loginTrace.setUserId(currentUser.getId());
loginTrace.setUserId(userId);
} }
// 记录客户端信息 // 记录客户端信息
String userAgent = request.getHeader("user-agent"); String userAgent = request.getHeader("user-agent");

View File

@ -25,12 +25,12 @@ import com.diboot.iam.auth.AuthService;
import com.diboot.iam.config.Cons; import com.diboot.iam.config.Cons;
import com.diboot.iam.dto.AuthCredential; import com.diboot.iam.dto.AuthCredential;
import com.diboot.iam.dto.SSOCredential; import com.diboot.iam.dto.SSOCredential;
import com.diboot.iam.entity.BaseLoginUser;
import com.diboot.iam.entity.IamAccount; import com.diboot.iam.entity.IamAccount;
import com.diboot.iam.entity.IamLoginTrace; import com.diboot.iam.entity.IamLoginTrace;
import com.diboot.iam.jwt.BaseJwtAuthToken; import com.diboot.iam.jwt.BaseJwtAuthToken;
import com.diboot.iam.service.IamAccountService; import com.diboot.iam.service.IamAccountService;
import com.diboot.iam.service.IamLoginTraceService; import com.diboot.iam.service.IamLoginTraceService;
import com.diboot.iam.util.BeanUtils;
import com.diboot.iam.util.HttpHelper; import com.diboot.iam.util.HttpHelper;
import com.diboot.iam.util.IamSecurityUtils; import com.diboot.iam.util.IamSecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -149,9 +149,9 @@ public class SSOAuthServiceImpl implements AuthService {
protected void saveLoginTrace(BaseJwtAuthToken authToken, boolean isSuccess){ protected void saveLoginTrace(BaseJwtAuthToken authToken, boolean isSuccess){
IamLoginTrace loginTrace = new IamLoginTrace(); IamLoginTrace loginTrace = new IamLoginTrace();
loginTrace.setAuthType(getAuthType()).setAuthAccount(authToken.getAuthAccount()).setUserType(authToken.getUserType()).setSuccess(isSuccess); loginTrace.setAuthType(getAuthType()).setAuthAccount(authToken.getAuthAccount()).setUserType(authToken.getUserType()).setSuccess(isSuccess);
Object currentUser = IamSecurityUtils.getCurrentUser(); BaseLoginUser currentUser = IamSecurityUtils.getCurrentUser();
if(currentUser != null){ if(currentUser != null){
Long userId = (Long) BeanUtils.getProperty(currentUser, Cons.FieldName.id.name()); Long userId = currentUser.getId();
loginTrace.setUserId(userId); loginTrace.setUserId(userId);
} }
// 记录客户端信息 // 记录客户端信息

View File

@ -39,6 +39,10 @@ public abstract class AuthCredential implements Serializable {
* 用户类型的Class * 用户类型的Class
*/ */
private Class userTypeClass = IamUser.class; private Class userTypeClass = IamUser.class;
/**
* 用户类型
*/
private String userType;
@NotNull(message = "认证方式不能为空") @NotNull(message = "认证方式不能为空")
private String authType; private String authType;
@ -62,6 +66,21 @@ public abstract class AuthCredential implements Serializable {
* @return * @return
*/ */
public String getUserType(){ public String getUserType(){
if(userType != null){
return userType;
}
return userTypeClass.getSimpleName(); return userTypeClass.getSimpleName();
} }
/**
* 指定用户类型class
* @param userTypeClass
*/
public void setUserTypeClass(Class userTypeClass){
this.userTypeClass = userTypeClass;
if(this.userType == null){
this.userType = userTypeClass.getSimpleName();
}
}
} }

View File

@ -0,0 +1,34 @@
package com.diboot.iam.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.diboot.core.entity.BaseEntity;
import com.diboot.core.vo.KeyValue;
/**
* 可登录用户Base类定义
* @author mazc@dibo.ltd
* @version v2.1.0
* @date 2020/06/28
*/
public abstract class BaseLoginUser extends BaseEntity {
/**
* 获取显示名称
* @return
*/
public abstract String getDisplayName();
/**
* 附加对象用于岗位等扩展
*/
@TableField(exist = false)
private KeyValue extentionObj;
public KeyValue getExtentionObj(){
return this.extentionObj;
}
public void setExtentionObj(KeyValue extentionObj){
this.extentionObj = extentionObj;
}
}

View File

@ -16,7 +16,6 @@
package com.diboot.iam.entity; package com.diboot.iam.entity;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.diboot.core.entity.BaseEntity;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -31,7 +30,7 @@ import javax.validation.constraints.NotNull;
* @date 2019-12-17 * @date 2019-12-17
*/ */
@Getter @Setter @Accessors(chain = true) @Getter @Setter @Accessors(chain = true)
public class IamUser extends BaseEntity { public class IamUser extends BaseLoginUser {
private static final long serialVersionUID = -8462352695775599715L; private static final long serialVersionUID = -8462352695775599715L;
// 组织ID // 组织ID
@ -76,8 +75,9 @@ public class IamUser extends BaseEntity {
@TableField() @TableField()
private String avatarUrl; private String avatarUrl;
// 附加对象用于岗位等身份切换 @Override
@TableField(exist = false) public String getDisplayName() {
private Object extentionObj; return this.realname;
}
} }

View File

@ -18,15 +18,16 @@ package com.diboot.iam.jwt;
import com.diboot.core.service.BaseService; import com.diboot.core.service.BaseService;
import com.diboot.core.util.ContextHelper; import com.diboot.core.util.ContextHelper;
import com.diboot.core.util.V; import com.diboot.core.util.V;
import com.diboot.core.vo.KeyValue;
import com.diboot.iam.annotation.process.ApiPermissionCache; import com.diboot.iam.annotation.process.ApiPermissionCache;
import com.diboot.iam.auth.AuthService; import com.diboot.iam.auth.AuthService;
import com.diboot.iam.auth.AuthServiceFactory; import com.diboot.iam.auth.AuthServiceFactory;
import com.diboot.iam.config.Cons; import com.diboot.iam.config.Cons;
import com.diboot.iam.entity.BaseLoginUser;
import com.diboot.iam.entity.IamAccount; import com.diboot.iam.entity.IamAccount;
import com.diboot.iam.entity.IamRole; import com.diboot.iam.entity.IamRole;
import com.diboot.iam.service.IamRolePermissionService; import com.diboot.iam.service.IamRolePermissionService;
import com.diboot.iam.service.IamUserRoleService; import com.diboot.iam.service.IamUserRoleService;
import com.diboot.iam.util.BeanUtils;
import com.diboot.iam.util.IamSecurityUtils; import com.diboot.iam.util.IamSecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
@ -94,31 +95,26 @@ public class BaseJwtRealm extends AuthorizingRealm {
throw new AuthenticationException("用户账号或密码错误!"); throw new AuthenticationException("用户账号或密码错误!");
} }
// 获取当前user对象并缓存 // 获取当前user对象并缓存
Object userObject = null; BaseLoginUser loginUser = null;
BaseService userService = ContextHelper.getBaseServiceByEntity(jwtToken.getUserTypeClass()); BaseService userService = ContextHelper.getBaseServiceByEntity(jwtToken.getUserTypeClass());
if(userService != null){ if(userService != null){
userObject = userService.getEntity(account.getUserId()); loginUser = (BaseLoginUser)userService.getEntity(account.getUserId());
} }
else{ else{
throw new AuthenticationException("用户 "+jwtToken.getUserTypeClass().getName()+" 相关的Service未定义"); throw new AuthenticationException("用户 "+jwtToken.getUserTypeClass().getName()+" 相关的Service未定义");
} }
if(userObject == null){ if(loginUser == null){
throw new AuthenticationException("用户不存在"); throw new AuthenticationException("用户不存在");
} }
if(iamUserRoleService.getIamExtensible() != null){ if(iamUserRoleService.getIamExtensible() != null){
Object extentionObj = iamUserRoleService.getIamExtensible().getUserExtentionObj(jwtToken.getUserTypeClass().getSimpleName(), account.getUserId()); KeyValue extentionObj = iamUserRoleService.getIamExtensible().getUserExtentionObj(jwtToken.getUserTypeClass().getSimpleName(), account.getUserId());
if(extentionObj != null){ if(extentionObj != null){
try{ loginUser.setExtentionObj(extentionObj);
BeanUtils.setProperty(userObject, "extentionObj", extentionObj);
}
catch (Exception e){
log.warn("设置{}.extentionObj异常属性不存在? {}", jwtToken.getUserTypeClass().getSimpleName(), e.getMessage());
}
} }
} }
// 清空当前用户缓存 // 清空当前用户缓存
this.clearCachedAuthorizationInfo(IamSecurityUtils.getSubject().getPrincipals()); this.clearCachedAuthorizationInfo(IamSecurityUtils.getSubject().getPrincipals());
return new SimpleAuthenticationInfo(userObject, jwtToken.getCredentials(), this.getName()); return new SimpleAuthenticationInfo(loginUser, jwtToken.getCredentials(), this.getName());
} }
} }
@ -130,21 +126,15 @@ public class BaseJwtRealm extends AuthorizingRealm {
@Override @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
Object currentUser = principals.getPrimaryPrincipal(); BaseLoginUser currentUser = (BaseLoginUser) principals.getPrimaryPrincipal();
// 根据用户类型与用户id获取roleList // 根据用户类型与用户id获取roleList
Long userId = (Long) BeanUtils.getProperty(currentUser, Cons.FieldName.id.name());
Long extentionObjId = null; Long extentionObjId = null;
try{ KeyValue extentionObj = currentUser.getExtentionObj();
Object extentionObj = BeanUtils.getProperty(currentUser, "extentionObj"); if(extentionObj != null){
if(extentionObj != null){ extentionObjId = (Long)extentionObj.getV();
extentionObjId = (Long)BeanUtils.getProperty(extentionObj, Cons.FieldName.id.name());
}
}
catch (Exception e){
log.warn("解析user.extentionObj异常: {}", e.getMessage());
} }
// 获取角色列表 // 获取角色列表
List<IamRole> roleList = iamUserRoleService.getUserRoleList(currentUser.getClass().getSimpleName(), userId, extentionObjId); List<IamRole> roleList = iamUserRoleService.getUserRoleList(currentUser.getClass().getSimpleName(), currentUser.getId(), extentionObjId);
// 如果没有任何角色返回 // 如果没有任何角色返回
if (V.isEmpty(roleList)){ if (V.isEmpty(roleList)){
return authorizationInfo; return authorizationInfo;

View File

@ -15,9 +15,11 @@
*/ */
package com.diboot.iam.service; package com.diboot.iam.service;
import com.diboot.core.entity.BaseEntity;
import com.diboot.iam.auth.IamExtensible; import com.diboot.iam.auth.IamExtensible;
import com.diboot.iam.entity.IamRole; import com.diboot.iam.entity.IamRole;
import com.diboot.iam.entity.IamUserRole; import com.diboot.iam.entity.IamUserRole;
import com.diboot.iam.vo.IamRoleVO;
import java.util.List; import java.util.List;
@ -64,6 +66,13 @@ public interface IamUserRoleService extends BaseIamService<IamUserRole> {
*/ */
boolean updateUserRoleRelations(String userType, Long userId, List<Long> roleIds); boolean updateUserRoleRelations(String userType, Long userId, List<Long> roleIds);
/***
* 获取用户的所有角色列表包括扩展的关联角色
* @param userObject
* @return
*/
List<IamRoleVO> getAllRoleVOList(BaseEntity userObject);
/** /**
* 获取Iam扩展实现 * 获取Iam扩展实现
* @return * @return

View File

@ -18,6 +18,7 @@ package com.diboot.iam.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.diboot.core.exception.BusinessException; import com.diboot.core.exception.BusinessException;
import com.diboot.core.util.BeanUtils;
import com.diboot.core.util.S; import com.diboot.core.util.S;
import com.diboot.core.util.V; import com.diboot.core.util.V;
import com.diboot.core.vo.Status; import com.diboot.core.vo.Status;
@ -26,7 +27,6 @@ import com.diboot.iam.dto.IamFrontendPermissionDTO;
import com.diboot.iam.entity.IamFrontendPermission; import com.diboot.iam.entity.IamFrontendPermission;
import com.diboot.iam.mapper.IamFrontendPermissionMapper; import com.diboot.iam.mapper.IamFrontendPermissionMapper;
import com.diboot.iam.service.IamFrontendPermissionService; import com.diboot.iam.service.IamFrontendPermissionService;
import com.diboot.iam.util.BeanUtils;
import com.diboot.iam.vo.IamFrontendPermissionListVO; import com.diboot.iam.vo.IamFrontendPermissionListVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@ -16,6 +16,7 @@
package com.diboot.iam.service.impl; package com.diboot.iam.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.diboot.core.util.BeanUtils;
import com.diboot.core.util.V; import com.diboot.core.util.V;
import com.diboot.iam.entity.IamFrontendPermission; import com.diboot.iam.entity.IamFrontendPermission;
import com.diboot.iam.entity.IamRolePermission; import com.diboot.iam.entity.IamRolePermission;
@ -23,7 +24,6 @@ import com.diboot.iam.mapper.IamRolePermissionMapper;
import com.diboot.iam.service.IamFrontendPermissionService; import com.diboot.iam.service.IamFrontendPermissionService;
import com.diboot.iam.service.IamRolePermissionService; import com.diboot.iam.service.IamRolePermissionService;
import com.diboot.iam.service.IamRoleService; import com.diboot.iam.service.IamRoleService;
import com.diboot.iam.util.BeanUtils;
import com.diboot.iam.util.IamSecurityUtils; import com.diboot.iam.util.IamSecurityUtils;
import com.diboot.iam.vo.IamFrontendPermissionVO; import com.diboot.iam.vo.IamFrontendPermissionVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@ -17,6 +17,9 @@ package com.diboot.iam.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.diboot.core.binding.Binder;
import com.diboot.core.entity.BaseEntity;
import com.diboot.core.util.BeanUtils;
import com.diboot.core.util.ContextHelper; import com.diboot.core.util.ContextHelper;
import com.diboot.core.util.V; import com.diboot.core.util.V;
import com.diboot.iam.auth.IamExtensible; import com.diboot.iam.auth.IamExtensible;
@ -28,8 +31,8 @@ import com.diboot.iam.mapper.IamUserRoleMapper;
import com.diboot.iam.service.IamAccountService; import com.diboot.iam.service.IamAccountService;
import com.diboot.iam.service.IamRoleService; import com.diboot.iam.service.IamRoleService;
import com.diboot.iam.service.IamUserRoleService; import com.diboot.iam.service.IamUserRoleService;
import com.diboot.iam.util.BeanUtils;
import com.diboot.iam.util.IamSecurityUtils; import com.diboot.iam.util.IamSecurityUtils;
import com.diboot.iam.vo.IamRoleVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -207,6 +210,14 @@ public class IamUserRoleServiceImpl extends BaseIamServiceImpl<IamUserRoleMapper
return success; return success;
} }
@Override
public List<IamRoleVO> getAllRoleVOList(BaseEntity userObject) {
List<IamRole> roleList = getUserRoleList(userObject.getClass().getSimpleName(), userObject.getId());
if (V.isEmpty(roleList)){
return null;
}
return Binder.convertAndBindRelations(roleList, IamRoleVO.class);
}
// 扩展接口检查标记 // 扩展接口检查标记
private boolean iamExtensibleImplChecked = false; private boolean iamExtensibleImplChecked = false;

View File

@ -16,20 +16,21 @@
package com.diboot.iam.service.impl; package com.diboot.iam.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.diboot.core.binding.Binder;
import com.diboot.core.exception.BusinessException; import com.diboot.core.exception.BusinessException;
import com.diboot.core.util.S;
import com.diboot.core.util.V; import com.diboot.core.util.V;
import com.diboot.core.vo.Status; import com.diboot.core.vo.Status;
import com.diboot.iam.config.Cons; import com.diboot.iam.config.Cons;
import com.diboot.iam.dto.IamUserAccountDTO; import com.diboot.iam.dto.IamUserAccountDTO;
import com.diboot.iam.entity.*; import com.diboot.iam.entity.IamAccount;
import com.diboot.iam.entity.IamFrontendPermission;
import com.diboot.iam.entity.IamUser;
import com.diboot.iam.entity.IamUserRole;
import com.diboot.iam.mapper.IamUserMapper; import com.diboot.iam.mapper.IamUserMapper;
import com.diboot.iam.service.IamAccountService; import com.diboot.iam.service.IamAccountService;
import com.diboot.iam.service.IamFrontendPermissionService; import com.diboot.iam.service.IamFrontendPermissionService;
import com.diboot.iam.service.IamUserRoleService; import com.diboot.iam.service.IamUserRoleService;
import com.diboot.iam.service.IamUserService; import com.diboot.iam.service.IamUserService;
import com.diboot.iam.util.BeanUtils; import com.diboot.iam.util.IamHelper;
import com.diboot.iam.util.IamSecurityUtils; import com.diboot.iam.util.IamSecurityUtils;
import com.diboot.iam.vo.IamRoleVO; import com.diboot.iam.vo.IamRoleVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -37,7 +38,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -67,34 +67,13 @@ public class IamUserServiceImpl extends BaseIamServiceImpl<IamUserMapper, IamUse
} }
// 附加额外的一些权限给与特性的角色 // 附加额外的一些权限给与特性的角色
attachExtraPermissions(roleVOList); attachExtraPermissions(roleVOList);
// 对RoleList做聚合处理以适配前端 // 组合为前端格式
List<String> nameList = new ArrayList<>(); return IamHelper.buildRoleVo4FrontEnd(roleVOList);
List<String> codeList = new ArrayList<>();
List<IamFrontendPermission> allPermissionList = new ArrayList<>();
roleVOList.forEach(vo -> {
nameList.add(vo.getName());
codeList.add(vo.getCode());
if (V.notEmpty(vo.getPermissionList())){
allPermissionList.addAll(vo.getPermissionList());
}
});
// 对permissionList进行去重
List permissionList = BeanUtils.distinctByKey(allPermissionList, IamFrontendPermission::getId);
IamRoleVO roleVO = new IamRoleVO();
roleVO.setName(S.join(nameList));
roleVO.setCode(S.join(codeList));
roleVO.setPermissionList(permissionList);
return roleVO;
} }
@Override @Override
public List<IamRoleVO> getAllRoleVOList(IamUser iamUser) { public List<IamRoleVO> getAllRoleVOList(IamUser iamUser) {
List<IamRole> roleList = iamUserRoleService.getUserRoleList(IamUser.class.getSimpleName(), iamUser.getId()); return iamUserRoleService.getAllRoleVOList(iamUser);
if (V.isEmpty(roleList)){
return null;
}
return Binder.convertAndBindRelations(roleList, IamRoleVO.class);
} }
@Override @Override

View File

@ -1,86 +0,0 @@
/*
* Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* https://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.diboot.iam.util;
import com.diboot.core.util.IGetter;
import com.diboot.core.util.V;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.PropertyAccessorFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BeanUtils extends com.diboot.core.util.BeanUtils {
private static final Logger log = LoggerFactory.getLogger(BeanUtils.class);
/**
* 从list对象列表中提取指定属性值到新的List
* @param objectList 对象list
* @param getterFn get方法
* @param <T>
* @return
*/
public static <E,T> List collectToList(List<E> objectList, IGetter<T> getterFn){
if(V.isEmpty(objectList)){
return Collections.emptyList();
}
String getterPropName = convertToFieldName(getterFn);
return collectToList(objectList, getterPropName);
}
/***
* 从list对象列表中提取指定属性值到新的List
* @param objectList
* @param getterPropName
* @param <E>
* @return
*/
public static <E> List collectToList(List<E> objectList, String getterPropName){
List fieldValueList = new ArrayList();
try{
for(E object : objectList){
Object fieldValue = getProperty(object, getterPropName);
if(fieldValue != null && !fieldValueList.contains(fieldValue)){
fieldValueList.add(fieldValue);
}
}
}
catch (Exception e){
log.warn("提取属性值异常, getterPropName="+getterPropName, e);
}
return fieldValueList;
}
/***
* 获取对象的属性值
* @param obj
* @param field
* @return
*/
public static Object getProperty(Object obj, String field){
try {
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(obj);
return wrapper.getPropertyValue(field);
} catch (Exception e) {
log.error("获取对象属性值出错返回null", e);
}
return null;
}
}

View File

@ -0,0 +1,51 @@
package com.diboot.iam.util;
import com.diboot.core.util.BeanUtils;
import com.diboot.core.util.S;
import com.diboot.core.util.V;
import com.diboot.iam.entity.IamFrontendPermission;
import com.diboot.iam.vo.IamRoleVO;
import java.util.ArrayList;
import java.util.List;
/**
* IAM相关辅助类
*
* @author mazc@dibo.ltd
* @version v1.0
* @date 2020/06/28
*/
public class IamHelper {
/**
* 构建role-permission角色权限数据格式(合并role等)用于前端适配
* @param roleVOList
* @return
*/
public static IamRoleVO buildRoleVo4FrontEnd(List<IamRoleVO> roleVOList) {
if (V.isEmpty(roleVOList)){
return null;
}
// 对RoleList做聚合处理以适配前端
List<String> nameList = new ArrayList<>();
List<String> codeList = new ArrayList<>();
List<IamFrontendPermission> allPermissionList = new ArrayList<>();
roleVOList.forEach(vo -> {
nameList.add(vo.getName());
codeList.add(vo.getCode());
if (V.notEmpty(vo.getPermissionList())){
allPermissionList.addAll(vo.getPermissionList());
}
});
// 对permissionList进行去重
List permissionList = BeanUtils.distinctByKey(allPermissionList, IamFrontendPermission::getId);
IamRoleVO roleVO = new IamRoleVO();
roleVO.setName(S.join(nameList));
roleVO.setCode(S.join(codeList));
roleVO.setPermissionList(permissionList);
return roleVO;
}
}

View File

@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version> <version>2.3.1.RELEASE</version>
<relativePath/> <relativePath/>
</parent> </parent>
@ -25,7 +25,7 @@
<properties> <properties>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<springboot.version>2.3.0.RELEASE</springboot.version> <springboot.version>2.3.1.RELEASE</springboot.version>
</properties> </properties>
<dependencies> <dependencies>
@ -62,7 +62,7 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<!-- SpringBoot 2.3.0 新增依赖 --> <!-- SpringBoot 2.3.x 新增依赖 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
@ -81,7 +81,7 @@
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>1.2.70</version> <version>1.2.71</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>