
org.tinygroup.bizframe.impl.DbModelPermissionManager Maven / Gradle / Ivy
The newest version!
/**
* Copyright (c) 1997-2013, tinygroup.org ([email protected]).
*
* Licensed under the GPL, Version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/gpl.html
*
* 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.
* --------------------------------------------------------------------------
* 版权 (c) 1997-2013, tinygroup.org ([email protected]).
*
* 本开源软件遵循 GPL 3.0 协议;
* 如果您不遵循此协议,则不被允许使用此文件。
* 你可以从下面的地址获取完整的协议文本
*
* http://www.gnu.org/licenses/gpl.html
*/
package org.tinygroup.bizframe.impl;
import java.util.ArrayList;
import java.util.List;
import org.tinygroup.bizframe.PermissionObject;
import org.tinygroup.bizframe.PermissionSubject;
import org.tinygroup.springutil.SpringUtil;
import org.tinygroup.tinydb.Bean;
import org.tinygroup.tinydb.BeanOperatorManager;
import org.tinygroup.tinydb.config.TableConfiguration;
import org.tinygroup.tinydb.exception.DBRuntimeException;
import org.tinygroup.tinydb.operator.DBOperator;
import org.tinygroup.tinydb.util.TinyBeanUtil;
/**
* 功能说明: 模型概念的权限管理数据库存储实现,权限关联表名:auth_relation
*
* 开发人员: renhui
* 开发时间: 2013-7-31
*
*/
@SuppressWarnings("rawtypes")
public class DbModelPermissionManager>
extends AbstractPermissionManager {
/**
* 权限关联关系表的beanType
*/
private static final String AUTH_RELATION_BEAN_NAME = "authRelation";
private static final String PERMISSION_SUBJECT_ID = "subjectId";
private static final String PERMISSION_OBJECT_ID = "objectId";
private static final String PERMISSION_SUBJECT_TYPE = "subjectType";
private static final String PERMISSION_OBJECT_TYPE = "objectType";
private static final String PERMISSION_STATUS = "status";
private static final String PARENT_ID = "parentId";
private AuthRelationCache cache = new AuthRelationCache();
/**
* 关联表状态字段 1、允许 0、禁止
*/
private static final String STATUS = "status";
public static final String ALLOW = "1";
public static final String BLOCK = "0";
/**
* tinydb 数据库操作管理类
*/
private BeanOperatorManager manager;
// /**
// * 缓存起来,不用每次从管理器中获取
// */
// private Map operatorMap=new HashMap();
public BeanOperatorManager getManager() {
if (manager == null) {
manager = SpringUtil.getBean("beanOperatorManager");
}
return manager;
}
public void setManager(BeanOperatorManager manager) {
this.manager = manager;
}
@SuppressWarnings("unchecked")
public void init() {
if (cacheSupport && existTable()) {
Bean relation = new Bean(AUTH_RELATION_BEAN_NAME);
DBOperator> operator = getManager().getDbOperator(AUTH_RELATION_BEAN_NAME);
Bean[] beans = operator.getBeans(relation);
for (Bean bean : beans) {
cache.addAuthRelation((String) bean.getProperty(PERMISSION_STATUS), (String) bean.getProperty(PERMISSION_SUBJECT_TYPE), (K) bean.getProperty(PERMISSION_SUBJECT_ID), (String) bean.getProperty(PERMISSION_OBJECT_TYPE), (K) bean.getProperty(PERMISSION_OBJECT_ID), bean);
}
}
}
/**
* 保存权限主体信息到数据库中
*/
@SuppressWarnings("unchecked")
public PermissionSubject addPermissionSubject(PermissionSubject permissionSubject) {
DBOperator> operator = getManager().getDbOperator(permissionSubject.getType());
Bean bean = operator.insert(TinyBeanUtil.object2Bean(permissionSubject, new Bean(permissionSubject.getType())));
PermissionSubject subject = TinyBeanUtil.bean2Object(bean, permissionSubject.getClass());
String primaryKeyName = getPrimaryKeyName(permissionSubject.getType());
subject.setId(String.valueOf(bean.getProperty(operator.getBeanDbNameConverter().dbFieldNameToPropertyName(primaryKeyName))));
if (cacheSupport) {// 支持缓存
cache.addPermissionSubject(subject);
}
return subject;
}
/**
* 保存权限客体到数据库中
*/
@SuppressWarnings("unchecked")
public PermissionObject addPermissionObject(PermissionObject permissionObject) {
DBOperator> operator = getManager().getDbOperator(permissionObject.getType());
Bean bean = operator.insert(TinyBeanUtil.object2Bean(permissionObject, new Bean(permissionObject.getType())));
PermissionObject object = TinyBeanUtil.bean2Object(bean, permissionObject.getClass());
String primaryKeyName = getPrimaryKeyName(permissionObject.getType());
object.setId((K) bean.getProperty(operator.getBeanDbNameConverter().dbFieldNameToPropertyName(primaryKeyName)));
if (cacheSupport) {
cache.addPermissionObject(object);
}
return object;
}
public void removePermissionObject(PermissionObject permissionObject) {
DBOperator> operator = getManager().getDbOperator(permissionObject.getType());
operator.delete(TinyBeanUtil.object2Bean(permissionObject, new Bean(permissionObject.getType())));
if (cacheSupport) {
cache.removePermissionObject(permissionObject);
}
}
public void removePermissionSubject(PermissionSubject permissionSubject) {
DBOperator> operator = getManager().getDbOperator(permissionSubject.getType());
operator.delete(TinyBeanUtil.object2Bean(permissionSubject, new Bean(permissionSubject.getType())));
if (cacheSupport) {
cache.removePermissionSubject(permissionSubject);
}
}
@SuppressWarnings("unchecked")
public PermissionSubject getPermissionSubject(String subjectBeanType, K keyValue,
Class extends PermissionSubject> subjectClassType) {
PermissionSubject permissionSubject = null;
if (cacheSupport) {
permissionSubject = cache.getPermissionSubject(subjectBeanType, keyValue);
}
if (permissionSubject == null) {
DBOperator operator = (DBOperator) getManager().getDbOperator(subjectBeanType);
Bean bean = operator.getBean(keyValue);
String primaryKeyName = getPrimaryKeyName(subjectBeanType);
permissionSubject = (PermissionSubject) TinyBeanUtil.bean2Object(bean, subjectClassType);
permissionSubject.setId(getPrimaryKeyValue(operator, bean, primaryKeyName));
}
return permissionSubject;
}
@SuppressWarnings("unchecked")
public PermissionObject getPermissionObject(String objectBeanType, K keyValue,
Class extends PermissionObject> objectClassType) {
PermissionObject permissionObject = null;
if (cacheSupport) {
permissionObject = cache.getPermissionObject(objectBeanType, keyValue);
}
if (permissionObject == null) {
DBOperator operator = (DBOperator) getManager().getDbOperator(objectBeanType);
Bean bean = operator.getBean(keyValue);
String primaryKeyName = getPrimaryKeyName(objectBeanType);
permissionObject = (PermissionObject) TinyBeanUtil.bean2Object(bean, objectClassType);
permissionObject.setId(getPrimaryKeyValue(operator, bean, primaryKeyName));
}
return permissionObject;
}
/**
* 获取主键值
*
* @param operator
* @param bean
* @param primaryKeyName
* @return
*/
private String getPrimaryKeyValue(DBOperator operator, Bean bean, String primaryKeyName) {
return String.valueOf(bean.getProperty(operator.getBeanDbNameConverter().dbFieldNameToPropertyName(primaryKeyName)));
}
public boolean isBlockDirectly(PermissionSubject permissionSubject,
PermissionObject permissionObject) {
return isBlockDirectly(permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
public boolean isAllowDirectly(PermissionSubject permissionSubject,
PermissionObject permissionObject) {
return isAllowDirectly(permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
public boolean isBlockDirectly(String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
RelationTempObject relation = createRelationTempObject(BLOCK, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
if (relation.existTable()) {
if (cacheSupport) {
Bean bean = cache.getAuthRelation(BLOCK, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
if (bean != null) {
return true;
}
}
Bean[] beans = getManager().getDbOperator(relation.getRelationType()).getBeans(relation.getBean());
if (beans != null && beans.length > 0) {
return true;
}
}
return false;
}
public boolean isAllowDirectly(String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
RelationTempObject relation = createRelationTempObject(ALLOW, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
if (relation.existTable()) {
if (cacheSupport) {
Bean bean = cache.getAuthRelation(ALLOW, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
if (bean != null) {
return true;
}
}
Bean[] beans = getManager().getDbOperator(relation.getRelationType()).getBeans(relation.getBean());
if (beans != null && beans.length > 0) {
return true;
}
}
return false;
}
/**
* 为权限主体与客体绑定关联关系
*/
public void addAllowPermission(PermissionSubject permissionSubject,
PermissionObject permissionObject) {
addRelationInfo(ALLOW, permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
public void addAllowPermission(List> permissionSubjectList,
List> permissionObjectList) {
addRelationInfos(ALLOW, permissionSubjectList, permissionObjectList);
}
public void removeAllowPermission(PermissionSubject permissionSubject,
PermissionObject permissionObject) {
deleteRelationInfo(ALLOW, permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
public void removeAllowPermission(List> permissionSubjectList,
List> permissionObjectList) {
deleteRelationInfos(ALLOW, permissionSubjectList, permissionObjectList);
}
public void addAllowPermission(String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
addRelationInfo(ALLOW, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
}
public void removeAllowPermission(String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
deleteRelationInfo(ALLOW, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
}
public void addBlockPermission(PermissionSubject permissionSubject,
PermissionObject permissionObject) {
addRelationInfo(BLOCK, permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
public void addBlockPermission(List> permissionSubjectList,
List> permissionObjectList) {
addRelationInfos(BLOCK, permissionSubjectList, permissionObjectList);
}
public void removeBlockPermission(PermissionSubject permissionSubject,
PermissionObject permissionObject) {
deleteRelationInfo(BLOCK, permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
public void removeBlockPermission(List> permissionSubjectList,
List> permissionObjectList) {
deleteRelationInfos(BLOCK, permissionSubjectList, permissionObjectList);
}
public void addBlockPermission(String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
addRelationInfo(BLOCK, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
}
public void removeBlockPermission(String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
deleteRelationInfo(BLOCK, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
}
private String getPrimaryKeyName(String beanType) {
TableConfiguration configuration = getManager().getTableConfigurationByBean(beanType);
if (configuration != null) {
return configuration.getPrimaryKey().getColumnName();
}
throw new DBRuntimeException("tinydb.notExistPrimaryField", beanType);
}
private void addRelationInfo(String status, String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
RelationTempObject relation = createRelationTempObject(status, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
if (relation.existTable()) {
getManager().getDbOperator(relation.getRelationType()).insert(relation.getBean());
if (cacheSupport) {
cache.addAuthRelation(status, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId, relation.getBean());
}
}
}
private void addRelationInfos(String status,
List> permissionSubjectList,
List> permissionObjectList) {
RelationTempObject relation = new RelationTempObject();
relation.setRelationType(AUTH_RELATION_BEAN_NAME);
if (relation.existTable()) {
List beans = new ArrayList();
if (permissionSubjectList.size() > 0 && permissionObjectList.size() > 0) {
for (PermissionSubject permissionSubject : permissionSubjectList) {
for (PermissionObject permissionObject : permissionObjectList) {
Bean bean = createRelationBean(status, permissionSubject, permissionObject);
beans.add(bean);
if (cacheSupport) {
cache.addAuthRelation(status, permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId(), bean);
}
}
}
relation.setBeans(beans);
getManager().getDbOperator(relation.getRelationType()).batchInsert(beans);
}
}
}
private void deleteRelationInfos(String status,
List> permissionSubjectList,
List> permissionObjectList) {
RelationTempObject relation = new RelationTempObject();
relation.setRelationType(AUTH_RELATION_BEAN_NAME);
if (relation.existTable()) {
List beans = new ArrayList();
if (permissionSubjectList.size() > 0 && permissionObjectList.size() > 0) {
for (PermissionSubject permissionSubject : permissionSubjectList) {
for (PermissionObject permissionObject : permissionObjectList) {
Bean bean = createRelationBean(status, permissionSubject, permissionObject);
beans.add(bean);
if (cacheSupport) {
cache.removeAuthRelation(status, permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
}
}
relation.setBeans(beans);
getManager().getDbOperator(relation.getRelationType()).batchDelete(beans);
}
}
}
private void deleteRelationInfo(String status, String permissionSubjectType,
K permissionSubjectId, String permissionObjectType,
K permissionObjectId) {
RelationTempObject relation = createRelationTempObject(status, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
if (relation.existTable()) {
getManager().getDbOperator(relation.getRelationType()).delete(relation.getBean());
if (cacheSupport) {
cache.removeAuthRelation(status, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
}
}
}
/**
* 创建权限主体与客体关联关系的bean
*
* @param status
* @param permissionSubjectType
* @param permissionSubjectId
* @param permissionObjectType
* @param permissionObjectId
* @return
*/
private RelationTempObject createRelationTempObject(String status, String permissionSubjectType,
K permissionSubjectId,
String permissionObjectType,
K permissionObjectId) {
RelationTempObject relation = new RelationTempObject();
Bean relationBean = newRelationBean(status, permissionSubjectType, permissionSubjectId, permissionObjectType, permissionObjectId);
relation.setBean(relationBean);
relation.setRelationType(AUTH_RELATION_BEAN_NAME);
return relation;
}
/**
* 创建权限关联bean实例
*
* @param status
* @param permissionSubjectType
* @param permissionSubjectId
* @param permissionObjectType
* @param permissionObjectId
* @return
*/
private Bean newRelationBean(String status, String permissionSubjectType, K permissionSubjectId,
String permissionObjectType, K permissionObjectId) {
Bean relationBean = new Bean(AUTH_RELATION_BEAN_NAME);
relationBean.setProperty(PERMISSION_SUBJECT_ID, permissionSubjectId);
relationBean.setProperty(PERMISSION_SUBJECT_TYPE, permissionSubjectType);
relationBean.setProperty(PERMISSION_OBJECT_ID, permissionObjectId);
relationBean.setProperty(PERMISSION_OBJECT_TYPE, permissionObjectType);
relationBean.setProperty(STATUS, status);
return relationBean;
}
/**
* 创建权限关联bean实例
*
* @param permissionSubjectType
* @param permissionSubjectId
* @param permissionObjectType
* @return
*/
private Bean newRelationBean(String permissionSubjectType, K permissionSubjectId,
String permissionObjectType) {
Bean relationBean = new Bean(AUTH_RELATION_BEAN_NAME);
relationBean.setProperty(PERMISSION_SUBJECT_ID, permissionSubjectId);
relationBean.setProperty(PERMISSION_SUBJECT_TYPE, permissionSubjectType);
relationBean.setProperty(PERMISSION_OBJECT_TYPE, permissionObjectType);
return relationBean;
}
private Bean createRelationBean(String status, PermissionSubject permissionSubject,
PermissionObject permissionObject) {
return newRelationBean(status, permissionSubject.getType(), permissionSubject.getId(), permissionObject.getType(), permissionObject.getId());
}
private class RelationTempObject {
List beans;
String relationType;
Bean bean;
@SuppressWarnings("unused")
public List getBeans() {
return beans;
}
public void setBeans(List beans) {
this.beans = beans;
}
public String getRelationType() {
return relationType;
}
public void setRelationType(String relationType) {
this.relationType = relationType;
}
public boolean existTable() {
return DbModelPermissionManager.this.existTable();
}
public Bean getBean() {
return bean;
}
public void setBean(Bean bean) {
this.bean = bean;
}
}
public boolean existTable() {
return getManager().existsTable(AUTH_RELATION_BEAN_NAME, null);
}
@SuppressWarnings("unchecked")
public List> getPermissionObjects(String objectBeanType,
Class extends PermissionObject> objectClassType) {
DBOperator operator = (DBOperator) getManager().getDbOperator(objectBeanType);
Bean[] objectBeans = operator.getBeans(new Bean(objectBeanType));
List> permissionObjects = new ArrayList>();
String primaryKeyName = getPrimaryKeyName(objectBeanType);
if (objectBeans != null) {
for (Bean bean : objectBeans) {
PermissionObject permissionObject = (PermissionObject) TinyBeanUtil.bean2Object(bean, objectClassType);
permissionObject.setId(getPrimaryKeyValue(operator, bean, primaryKeyName));
permissionObjects.add(permissionObject);
}
}
return permissionObjects;
}
@SuppressWarnings("unchecked")
public List> getPermissionSubjects(String subjectBeanType,
Class extends PermissionSubject> subjectClassType) {
DBOperator operator = (DBOperator) getManager().getDbOperator(subjectBeanType);
Bean[] subjectBeans = operator.getBeans(new Bean(subjectBeanType));
List> permissionSubjects = new ArrayList>();
String primaryKeyName = getPrimaryKeyName(subjectBeanType);
if (subjectBeans != null) {
for (Bean bean : subjectBeans) {
PermissionSubject permissionSubject = (PermissionSubject) TinyBeanUtil.bean2Object(bean, subjectClassType);
permissionSubject.setId(getPrimaryKeyValue(operator, bean, primaryKeyName));
permissionSubjects.add(permissionSubject);
}
}
return permissionSubjects;
}
@SuppressWarnings("unchecked")
public List> getAssignedPermission(String subjectBeanType,
String objectBeanType,
K permissionSubjectId,
Class extends PermissionObject> objectClassType) {
List> permissionObjects = null;
if (cacheSupport) {
permissionObjects = cache.getPermissionObjectsWithSujectKey(subjectBeanType, objectBeanType, permissionSubjectId, objectClassType);
}
if (permissionObjects == null) {
Bean[] beans = getRelationBeans(subjectBeanType, objectBeanType, permissionSubjectId);
DBOperator objectOperator = getManager().getDbOperator(objectBeanType);
permissionObjects = new ArrayList>();
if (beans != null) {
for (Bean bean : beans) {
K objectId = (K) bean.getProperty(PERMISSION_OBJECT_ID);
Bean objectBean = objectOperator.getBean(objectId);
PermissionObject permissionObject = (PermissionObject) TinyBeanUtil.bean2Object(objectBean, objectClassType);
permissionObject.setId(objectId);
permissionObjects.add(permissionObject);
}
}
}
return permissionObjects;
}
@SuppressWarnings("unchecked")
private Bean[] getRelationBeans(String subjectBeanType, String objectBeanType,
K permissionSubjectId) {
String relationBeanType = AUTH_RELATION_BEAN_NAME;
DBOperator operator = (DBOperator) getManager().getDbOperator(relationBeanType);
Bean relationBean = newRelationBean(subjectBeanType, permissionSubjectId, objectBeanType);
Bean[] beans = operator.getBeans(relationBean);
return beans;
}
@SuppressWarnings("unchecked")
public List> getChildPermissionSubjects(String subjectBeanType,
K parentSubjectId,
Class extends PermissionSubject> subjectClassType) {
Bean queryBean = new Bean(subjectBeanType);
queryBean.setProperty(PARENT_ID, parentSubjectId);
DBOperator operator = (DBOperator) getManager().getDbOperator(subjectBeanType);
Bean[] beans = operator.getBeans(queryBean);
List> children = new ArrayList>();
if (beans != null) {
String primaryKeyName = getPrimaryKeyName(subjectBeanType);
for (Bean bean : beans) {
PermissionSubject permissionSubject = (PermissionSubject) TinyBeanUtil.bean2Object(bean, subjectClassType);
permissionSubject.setId(getPrimaryKeyValue(operator, bean, primaryKeyName));
children.add(permissionSubject);
}
}
return children;
}
@SuppressWarnings("unchecked")
public List> getChildPermissionObjects(String objectBeanType,
K parentObjectId,
Class extends PermissionObject> objectClassType) {
Bean queryBean = new Bean(objectBeanType);
queryBean.setProperty(PARENT_ID, parentObjectId);
DBOperator operator = (DBOperator) getManager().getDbOperator(objectBeanType);
Bean[] beans = operator.getBeans(queryBean);
List> children = new ArrayList>();
if (beans != null) {
String primaryKeyName = getPrimaryKeyName(objectBeanType);
for (Bean bean : beans) {
PermissionObject permissionObject = (PermissionObject) TinyBeanUtil.bean2Object(bean, objectClassType);
permissionObject.setId(getPrimaryKeyValue(operator, bean, primaryKeyName));
children.add(permissionObject);
}
}
return children;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy