/**
* AuthPlugin.java
* 2014-4-14
*/
package com.mtools.core.plugin.auth;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mtools.core.plugin.BasePlugin;
import com.mtools.core.plugin.constant.CoreConstans;
import com.mtools.core.plugin.entity.PageInfo;
import com.mtools.core.plugin.entity.Permission;
import com.mtools.core.plugin.entity.Role;
import com.mtools.core.plugin.entity.RoleVo;
import com.mtools.core.plugin.entity.Roleperm;
import com.mtools.core.plugin.entity.UserInfo;
import com.mtools.core.plugin.entiy.vo.AuthVo;
import com.mtools.core.plugin.helper.AIPGException;
import com.mtools.core.plugin.helper.FuncUtil;
/**
* @author zhang 权限管理插件 2014-4-14
*/
@Component("auth")
public class AuthPlugin extends BasePlugin {
@Cacheable(value="permOfUser",key="#userId + 'AuthPlugin.getPermOfUser'+#permType")
public List<Permission> getPermOfUser(String userId, String permType) throws Exception {
String sql = "select p.* from Permission p, roleperm r, USERROLE U where p.permid = r.permid and u.roleid = r.roleid and p.permtype=? and u.userid = ?";
List<Permission> perms = this.dao.search(sql, Permission.class,
permType, userId);
return perms;
}
@Cacheable(value="allPerms",key="AuthPlugin.getPerms")
public List<Permission> getPerms() throws Exception {
String sql = "select p.* from Permission p";
List<Permission> perms = this.dao.search(sql, Permission.class, null);
return perms;
}
/**
* 功能:判断权限 2014-4-18
*/
public boolean checkUri(List<Permission> perms, String uri) {
if (perms == null) {
return false;
} else {
for (Permission perm : perms) {
if (uri.equals(perm.getPermuri())) {
return true;
}
}
}
return false;
}
@Cacheable(value="permByUri",key="#Uri + 'AuthPlugin.getPermByUri'")
public Permission getPermByUri(String Uri) throws Exception {
String sql = "select p.* from Permission p where p.permuri like '%"
+ Uri.substring(1) + "%'";
List<Permission> perms = this.dao.search(sql, Permission.class, null);
if (perms.size() > 0) {
return perms.get(0);
}
return null;
}
/**
* 功能:根据url或者访问名称 2014-4-14
* @throws Exception
*/
@Cacheable(value="permNameByUri",key="#Uri + 'AuthPlugin.getPermName'")
public String getPermName(String Uri) throws Exception {
Permission perm = getPermByUri(Uri);
if (perm != null) {
return perm.getPermname();
} else {
return "未知功能";
}
}
/**
* 功能:检查是否具备访问权限 2014-4-14
*/
public void checkAccess(HttpServletRequest request) throws AIPGException {
String path = request.getServletPath();
log.info("访问URI:" + path);
UserInfo user = (UserInfo) request.getSession().getAttribute(
CoreConstans.LOGINGUSER);
if (user != null) {
List<Permission> perms = user.getPerms();
if (perms == null || !checkUri(perms, path)) {
throw new AIPGException(CoreConstans.EXCEPTON_03, "没有权限进行此操作");
}
}
}
/**
* 功能:查询权限列表 2014-4-23
*
* @param page
* @throws Exception
*/
@Cacheable(value="searchPerms",key="#perm.permid+''+#perm.permname+'AuthPlugin.searchPerm'+#perm.permuri+''+#page.pageIndex+''+#page.pageSize")
public List<AuthVo> searchPerm(Permission perm, String permtype,
PageInfo page) throws Exception {
String sql = "select p.* ,nvl(m.menuname,'其他') menuname from permission p left join menuinfo m on m.menuid=p.menuid where p.permtype=? ";
if (!FuncUtil.isEmpty(perm.getPermname())) {
sql += " and permname like '%" + perm.getPermname() + "%'";
}
if (!FuncUtil.isEmpty(perm.getMenuid())) {
sql += " and p.menuid =" + perm.getMenuid();
}
if (!FuncUtil.isEmpty(perm.getPermid())) {
sql += " and p.permid =" + perm.getPermid();
}
// 总笔数
int count = this.dao.count(sql, permtype);
if (!FuncUtil.isEmpty(page.getSort().getId())) {
sql += " order by permid " + page.getSort().getId();
}
if (!FuncUtil.isEmpty(page.getSort().getName())) {
sql += " order by permname " + page.getSort().getName();
}
page.setItemCount(count);
List<AuthVo> perms = this.dao.searchPage(sql, AuthVo.class,
Integer.parseInt(page.getPageIndex()),
Integer.parseInt(page.getPageSize()), permtype);
return perms;
}
/**
* 功能:新增权限 2014-4-23
*/
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
@CacheEvict(value={"permOfUser","searchPerms","permNameByUri","allPerms","UnselPermsByRole","selectPermRole","authCache"}, allEntries=true)
public void addAuth(Permission perm, String permtype, ModelMap model) {
try {
perm.setPermtype(permtype);
if (this.dao.add(perm) > 0) {
model.addAttribute(CoreConstans.OPTRESULT, "新增权限成功");
model.put(CoreConstans.SUCCESSMESSAGE, "新增权限成功!");
} else {
model.addAttribute(CoreConstans.OPTRESULT, "新增权限失败");
model.put(CoreConstans.SUCCESSMESSAGE, "新增权限失败!");
}
} catch (Exception ex) {
log.error("新增权限失败\n" + ex.getMessage(), ex);
model.addAttribute(CoreConstans.OPTRESULT, "新增权限失败");
model.put(CoreConstans.SUCCESSMESSAGE, "新增权限失败!");
}
}
/**
* 功能:修改权限 2014-4-23
*/
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
@CacheEvict(value={"permOfUser","searchPerms","permNameByUri","allPerms","UnselPermsByRole","selectPermRole","authCache"}, allEntries=true)
public void modAuth(Permission perm, ModelMap model) {
try {
if (this.dao.update(perm) > 0) {
model.addAttribute(CoreConstans.OPTRESULT, "修改权限成功");
model.put(CoreConstans.SUCCESSMESSAGE, "修改权限成功!");
} else {
model.addAttribute(CoreConstans.OPTRESULT, "修改权限失败");
model.put(CoreConstans.SUCCESSMESSAGE, "修改权限失败!");
}
} catch (Exception ex) {
log.error("修改权限失败\n" + ex.getMessage(), ex);
model.addAttribute(CoreConstans.OPTRESULT, "修改权限失败");
model.put(CoreConstans.SUCCESSMESSAGE, "修改权限失败!");
}
}
/**
* 功能: 2014-4-30
*/
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
@CacheEvict(value={"permOfUser","searchPerms","permNameByUri","allPerms","UnselPermsByRole","selectPermRole","authCache"}, allEntries=true)
public void deleteAuth(Permission perm, ModelMap model) {
try {
String[] ids = perm.getPermid().split(",");
for (String id : ids) {
perm.setPermid(id);
this.dao.delete(perm);
}
model.addAttribute(CoreConstans.OPTRESULT, "删除权限成功");
model.put(CoreConstans.SUCCESSMESSAGE, "删除权限成功!");
} catch (Exception ex) {
log.error("删除权限失败\n" + ex.getMessage(), ex);
model.addAttribute(CoreConstans.OPTRESULT, "删除权限失败");
model.put(CoreConstans.SUCCESSMESSAGE, "删除权限失败!");
}
}
/**
* 功能: 2014-5-4
* @param page
* @throws Exception
* @throws NumberFormatException
*/
@Cacheable(value="allroles",key="#role.roleid+''+#role.rolename+'AuthPlugin.getRoles'+#page.pageIndex")
public List<Role> getRoles(Role role, PageInfo page) throws NumberFormatException, Exception {
String sql = "select * from role r where 1=1 ";
if (!FuncUtil.isEmpty(role.getRoleid())) {
sql += " and r.roleid =" + role.getRoleid();
}
if (!FuncUtil.isEmpty(role.getRolename())) {
sql += " and r.rolename ='" + role.getRolename() + "'";
}
// 总笔数
int count = this.dao.count(sql, null);
page.setItemCount(count);
List<Role> roles = this.dao.searchPage(sql, Role.class,Integer.parseInt(page.getPageIndex()),Integer.parseInt(page.getPageSize()),null);
if(roles==null||roles.size()==0){
roles=Lists.newArrayList();
roles.add(new Role());
}
return roles;
}
/**
* 功能:已选择的权限 2014-5-5
* @throws Exception
*/
@Cacheable(value="selectPermRole",key="#role.roleid")
public List<Permission> getSelPermsByRole(Role role) throws Exception {
String sql = "select p.* from roleperm r ,permission p where p.permid=r.permid and r.roleid=?";
List<Permission> roleperms = this.dao.search(sql, Permission.class,
role.getRoleid());
return roleperms;
}
/**
* 功能:未选中的权限 2014-5-5
* @throws Exception
*/
@Cacheable(value="UnselPermsByRole",key="#role.roleid")
public List<Permission> getUnselPermsByRole(Role role) throws Exception {
String sql = "select p.* from permission p where p.permid not in(select r.permid from roleperm r,permission p where r.roleid=? and p.permid=r.permid)";
List<Permission> perms = this.dao.search(sql, Permission.class,
role.getRoleid());
return perms;
}
/**
* 功能:更新角色 2014-5-5
* @param unselpermids
*
* @param selperms
*
* @throws AIPGException
*/
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
@CacheEvict(value={"allroles","selectPermRole","UnselPermsByRole","permOfUser"}, allEntries=true)
public void modRole(Role role, String permids, String unselpermids, ModelMap model)
throws AIPGException {
try {
Roleperm rperm;
this.dao.update(role);
List<Permission> selperms = getSelPermsByRole(role);
for (Permission perm : selperms) {
rperm = new Roleperm();
rperm.setPermid(perm.getPermid());
rperm.setRoleid(role.getRoleid());
this.dao.delete(rperm);
}
if(permids==null)
permids="";
if(unselpermids==null)
unselpermids="";
String[] selectIds = permids.split(",");
for (String permid : selectIds) {
rperm = new Roleperm();
rperm.setPermid(permid);
rperm.setRoleid(role.getRoleid());
this.dao.add(rperm);
}
String[] unSelectIds = unselpermids.split(",");
for (String permid : unSelectIds) {
rperm = new Roleperm();
rperm.setPermid(permid);
rperm.setRoleid(role.getRoleid());
this.dao.delete(rperm);
}
model.addAttribute(CoreConstans.OPTRESULT, "更新角色成功");
model.put(CoreConstans.SUCCESSMESSAGE, "更新角色成功!");
} catch (Exception ex) {
log.error("更新角色失败\n" + ex.getMessage(), ex);
model.addAttribute(CoreConstans.OPTRESULT, "更新角色失败");
model.put(CoreConstans.SUCCESSMESSAGE, "更新角色失败!");
AIPGException.throwExcp(CoreConstans.EXCEPTON_01, "更新角色失败!");
}
}
/**
* 功能:
* 2014-5-5
*/
public void batchImportAuth(List<Permission> perms) {
// TODO Auto-generated method stub
}
/**
* 功能:添加新角色
* 2014-5-5
* @throws AIPGException
*/
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
@CacheEvict(value={"allroles"}, allEntries=true)
public void addRole(Role role, String permids, ModelMap model) throws AIPGException {
try {
Roleperm rperm;
Long roleid=this.getSeq("RLPERMSEQ");
role.setRoleid(String.valueOf(roleid));
this.dao.add(role);
if(permids==null)
permids="";
String[] selectIds = permids.split(",");
for (String permid : selectIds) {
rperm = new Roleperm();
rperm.setPermid(permid);
rperm.setRoleid(role.getRoleid());
this.dao.add(rperm);
}
model.addAttribute(CoreConstans.OPTRESULT, "新增角色成功");
model.put(CoreConstans.SUCCESSMESSAGE, "新增角色成功!");
} catch (Exception ex) {
log.error("添加角色失败\n" + ex.getMessage(), ex);
model.addAttribute(CoreConstans.OPTRESULT, "添加角色失败");
model.put(CoreConstans.SUCCESSMESSAGE, "添加角色失败!");
AIPGException.throwExcp(CoreConstans.EXCEPTON_01, "添加角色失败!");
}
}
/**
* 功能:删除角色
* 2014-5-5
* @throws AIPGException
*/
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
@CacheEvict(value={"allroles"}, allEntries=true)
public void deleteRole(Role role, String permids, ModelMap model) throws AIPGException {
try {
String[] ids = role.getRoleid().split(",");
for (String id : ids) {
role.setRoleid(id);
this.dao.delete(role);
this.dao.delete("delete from roleperm r where r.roleid=?", role.getRoleid());
}
model.addAttribute(CoreConstans.OPTRESULT, "删除角色成功");
model.put(CoreConstans.SUCCESSMESSAGE, "删除角色成功!");
}catch (Exception ex) {
log.error("删除角色失败\n" + ex.getMessage(), ex);
model.addAttribute(CoreConstans.OPTRESULT, "删除角色失败");
model.put(CoreConstans.SUCCESSMESSAGE, "删除角色失败!");
AIPGException.throwExcp(CoreConstans.EXCEPTON_01, "删除角色失败!");
}
}
/**
* 功能:角色信息
* 2014-5-7
* @throws Exception
*/
@Cacheable({"rolesFoMap"})
public Map<String, String> getRolesFoMap() throws Exception {
String sql = "select t.roleid,t.rolename from role t";
List<Object[]> roles = this.dao.searchForArray(sql, null);
Map<String, String> rolsMap = Maps.newConcurrentMap();
for (Object[] value : roles) {
rolsMap.put(value[0].toString(), value[1].toString());
}
return rolsMap;
}
/**
* 功能:角色信息
* 2014-5-7
* @param userid
* @throws Exception
*/
@Cacheable(value={"getroles"},key="#userid+'AuthPlugin.getRoles'")
public List<RoleVo> getRoles(String userid) throws Exception {
String sql = "select t.roleid,t.rolename,u.userid from role t left join (select r.* from userrole r where r.userid=?) u on u.roleid=t.roleid";
if(FuncUtil.isEmpty(userid)){
userid="";
}
List<RoleVo> roles = this.dao.search(sql,RoleVo.class, userid);
return roles;
}
}