package com.oa.service.serviceImpl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.oa.dao.AclDao;
import com.oa.dao.ModuleDao;
import com.oa.dao.UserRolesDao;
import com.oa.entity.ACL;
import com.oa.entity.Module;
import com.oa.entity.Permission;
import com.oa.entity.UserRoles;
import com.oa.service.ACLService;
@Transactional
@Service(value="aclService")
public class ACLServiceImpl implements ACLService {
@Resource(name="aclDao")
private AclDao aDao;
@Resource(name="userRolesDao")
private UserRolesDao uDao;
@Resource(name="moduleDao")
private ModuleDao mDao;
/**
* 授权过程
* 添加或更新权限
*/
@Override
public void addOrUpdatePermission(String principalType, int principalSn,
int resourceSn, int permission, boolean yes) throws Exception {
//根据 主体类型、主体标识 和 资源标识 查找 ACL
ACL acl = aDao.getAcl(principalType, principalSn, resourceSn);
//如果 ACL 不为空,则进行更新
if(acl != null){
acl.setPermission(permission, yes);
aDao.updateAcl(acl);
return;
}
//如果 ACL 为空,则进行添加
acl = new ACL();
acl.setPrincipalType(principalType);
acl.setPrincipalSn(principalSn);
acl.setResourceSn(resourceSn);
acl.setPermission(permission, yes);
aDao.addAcl(acl);
}
/**
* 设置用户某个资源授权的继承特性
* 添加或更改用户对某个资源的继承特性
*/
@Override
public void addOrUpdateUserExtends(int userId, int resourceSn, boolean yes)
throws Exception {
//根据 用户id 和 资源标识 查询 ACL信息
ACL acl = aDao.getAcl(ACL.TYPE_USER, userId, resourceSn);
//如果 acl 存在,则更新
if(acl != null){
acl.setExtends(yes);
aDao.updateAcl(acl);
return;
}
//如果 acl 不存在,则添加
acl = new ACL();
acl.setPrincipalType(ACL.TYPE_USER);
acl.setPrincipalSn(userId);
acl.setResourceSn(resourceSn);
acl.setExtends(yes);
aDao.addAcl(acl);
}
/**
* 删除授权信息
*/
@Override
public void delPermission(String principalType, int principalSn,
int resourceSn) throws Exception {
aDao.delAcl(principalType, principalSn, resourceSn);
}
/**
* 及时认证
*/
@Override
public boolean hasPermission(int userId, int resourceSn, int permission)
throws Exception {
//根据 用户标识、资源标识查找直接授予用户的授权信息
ACL acl = aDao.getAcl(ACL.TYPE_USER, userId, resourceSn);
if(acl != null){
int yes = acl.getPermission(permission);
//是确定的授权(允许 或 不允许)
if(yes != ACL.ACL_NEUTRAL){
return yes == ACL.ACL_YES ? true : false;
}
}
/* acl 为空,或授权是不确定的(即 继承),则查找用户的角色授权 信息 */
List<UserRoles> list = uDao.findUserRolesByUserId(userId);
//根据 list 可查出角色的所有信息
//按照角色优先级依次查找其授权
for(Iterator<UserRoles> userRole = list.iterator(); userRole.hasNext();){
//获取角色id
int roleId = userRole.next().getRole().getId();
//根据 角色类型、角色id、资源标识获取ACL信息
acl = aDao.getAcl(ACL.TYPE_ROLE, roleId, resourceSn);
//若该角色已经授权,则返回授权情况
if(acl != null){
return acl.getPermission(permission) == ACL.ACL_YES ? true : false;
}
}
return false;
}
/**
* 判断用户对某模块的某操作的授权(允许或不允许)
*/
@Override
public boolean hasPermissionByResourceSn(int userId, String reourceSn,
int permission) throws Exception {
Module module = mDao.getModuleBySn(reourceSn);
return hasPermission(userId, module.getId(), permission);
}
/**
* 搜索某个用户拥有读取权限的模块列表(用于登录,形成导航菜单的时候)
*/
@Override
public List<Module> searchModules(int userId) throws Exception {
//定义临时变量,用于存储 ACL实例
Map<Integer, ACL> temp = new HashMap<>();
//获取 userRoles 列表,目的是获得角色 id
List<UserRoles> list = uDao.findUserRolesByUserIdDesc(userId);
//依次循环列表,目的是根据 角色id 获取 ACL实例
for(int i = 0; i < list.size(); i++){
//获取 roleId
int roleId = list.get(i).getRole().getId();
//根据 roleId 获取授权列表
List<ACL> aclList = aDao.getAclByRoleId(roleId);
//把授权放到临时变量(temp)中
for(int j = 0; j < aclList.size(); j++){
temp.put(aclList.get(j).getResourceSn(), aclList.get(j));
}
}
//查找直接授予用户的授权列表,不继承
List<ACL> acls = aDao.getAclByUserId(userId);
for(int i = 0; i < acls.size(); i++){
temp.put(acls.get(i).getResourceSn(), acls.get(i));
}
/* 以上获取了该 user 的所有授权 (角色的 和 不继承的) */
//定义临时变量,用于存储无读取权限的授权的资源标识,用于删除
List<Integer> delAcl = new ArrayList<>();
Set<Map.Entry<Integer, ACL>> entries = temp.entrySet();
for(Iterator<Map.Entry<Integer, ACL>> iter = entries.iterator(); iter.hasNext();){
Map.Entry<Integer, ACL> entry = iter.next();
ACL acl = entry.getValue();
//如果没有读取权限,则添加到 delAcl 中
if(acl.getPermission(Permission.READ) == ACL.ACL_NO){
delAcl.add(entry.getKey());
}
}
//从 temp 中移除掉 delAcl 中的值
for(int i = 0; i < delAcl.size(); i++){
temp.remove(delAcl.get(i));
}
//如果授权列表是空的,则返回 0 长度的集合
if(temp.isEmpty()){
return new ArrayList<>();
}
//资源标识(即 模块id)
Set<Integer> moduleIds = temp.keySet();
//定义变量,用于存储模块列表
List<Module> modules = new ArrayList<>();
for(Iterator<Integer> iter = moduleIds.iterator(); iter.hasNext();){
int moduleId = iter.next();
Module module = mDao.getModuleById(moduleId);
modules.add(module);
}
return modules;
}
/**
* 根据主体类型和主体标识查找ACL记录
*/
@Override
public List<ACL> searchAclRecord(String principalType, int principalSn) throws Exception{
return aDao.searchAclRecord(principalType, principalSn);
}
/**
* 测试
*/
@Override
public int[][] get(String principalType, int principalSn)
throws Exception {
//根据 主体类型 和 主体标识 获取 ACL 记录
List<ACL> acls = searchAclRecord(principalType, principalSn);
//acls 的大小为二维数组中一维的长度
int[][] datas = new int[acls.size()][6];
//循环 acls ,并将需要的值赋给 datas
for(int i = 0; i < acls.size(); i++){
ACL acl = acls.get(i);
//前台需要 6 个值(即二维数组中二维长度为 6 )
datas[i][0] = acls.get(i).getResourceSn();
datas[i][1] = acl.getAclState()&1;
datas[i][2] = acl.getAclState()&2;
datas[i][3] = acl.getAclState()&4;
datas[i][4] = acl.getAclState()&8;
datas[i][5] = acl.getAclTriState();
}
return datas;
}
/**
* 添加 acl信息
*/
@Override
public void addAcl(ACL acl) throws Exception {
aDao.addAcl(acl);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
企业OA系统(spring+springMVC+Mybatis+Maven)毕业设计 (226个子文件)
mybatis.log.1 10MB
InitDatas.class 7KB
ACLServiceImpl.class 7KB
UserController.class 6KB
UserRolesController.class 5KB
OrgnizationController.class 4KB
TestModuleDao.class 4KB
TestOrgnization.class 3KB
PersonController.class 3KB
ModuleController.class 3KB
TestPerson.class 3KB
OrgnizationServiceImpl.class 3KB
TestRole.class 3KB
ACLController.class 3KB
RoleController.class 3KB
LoginController.class 2KB
TestAcl.class 2KB
TestUserRoles.class 2KB
TestUser.class 2KB
TestAclService.class 2KB
ModuleServiceImpl.class 2KB
ACL.class 2KB
Person.class 2KB
IndexController.class 2KB
RoleServiceImpl.class 2KB
LoginFilter.class 2KB
UserServiceImpl.class 2KB
Module.class 2KB
Orgnization.class 2KB
TestPersonService.class 2KB
PersonServiceImpl.class 2KB
User.class 2KB
TestOrgnizationService.class 2KB
UserRolesServiceImpl.class 1KB
TestUserService.class 1KB
UserRoles.class 1KB
OrgnizationDao.class 1KB
ModuleDao.class 1KB
TestInitDatas.class 1KB
AclDao.class 1KB
PersonDao.class 1015B
Authentication.class 947B
RoleDao.class 925B
PageModel.class 875B
UserRolesDao.class 870B
ACLService.class 821B
UserDao.class 787B
Role.class 708B
ModuleService.class 612B
RoleService.class 577B
UserService.class 460B
UserRolesService.class 447B
Permission.class 421B
OrgnizationService.class 419B
PersonService.class 358B
.classpath 2KB
org.eclipse.wst.common.component 662B
org.eclipse.wst.jsdt.ui.superType.container 49B
oa.css 6KB
login.css 1KB
logo_bg.gif 32KB
logo.gif 7KB
logo_copyright_bg.gif 5KB
logo.gif 2KB
userLogin_button.gif 2KB
userLogin.gif 2KB
addpic.gif 1KB
title_middle.gif 1KB
cz.gif 940B
title_left.gif 544B
peditor.gif 450B
arrowdown.gif 424B
netm.gif 414B
arrowup.gif 407B
mail.gif 369B
news.gif 368B
word.gif 366B
title_right.gif 303B
userLogin_down.gif 177B
dela.gif 121B
file1.gif 89B
logo_under_line.gif 62B
com.jzt-poi-ooxml-schemas-3.9.jar 4.58MB
org.apache.poi-poi-ooxml-schemas-3.9.jar 4.58MB
com.jzt-poi-3.9.jar 1.78MB
org.apache.poi-poi-3.9.jar 1.78MB
org.apache.poi-poi-ooxml-3.9.jar 915KB
com.jzt-poi-ooxml-3.9.jar 915KB
dwr.jar 478KB
standard.jar 384KB
jaxen-1.1-beta-7.jar 222KB
servlet-api.jar 173KB
com.jzt-jedis-2.1.0.jar 136KB
redis.clients-jedis-2.1.0.jar 136KB
jsp-api.jar 87KB
pager-taglib.jar 46KB
jstl.jar 20KB
ACLServiceImpl.java 7KB
UserController.java 6KB
InitDatas.java 5KB
共 226 条
- 1
- 2
- 3
放羊娃安浩
- 粉丝: 3
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页