之前写过一个aop后台管理系统权限功能,发现贴出来的代码不是很完整。可能会造成参考的用户会运行不正常。
下面我将图文结合。贴出完整版代码!此功能不适用所有的aop后台权限。仅限同类型风格之类的可用。
mysql数据库创建权限表和管理员权限表:
该表为后台功能表。
表对应的就是该后台的主要功能,表中间的拼音是功能的 缩写。我这边用来做权限判断使用。
下面是管理员权限列表
这里面第二列id是关联上面功能的主键。第三列是管理员id 后面的 function_xxx 这些列就是管理员拥有该功能的权限。
99:无权限 0:有权限。创建时。默认拥有select权限,其他应该为99
表基本结束。下面就是功能实现。
1:创建权限枚举
主要就是增删改查。默认都拥有即:0,请给key value get set下。我这边就截图。并没有赋值代码。
2:创建权限注解
这个类我是存放在pojo包下的。
这2个图是有关联的。第二张图调用了第一张图片。
3:开始的时候。我们创建了2个表,功能权限表和管理员权限表。
对这2个表创建pojo
这2个实体类请gei set下。
4:创建service/serviceimpl (spring mvc)
该service方法等下解析权限的时候用得到。
至于调用mapper方法。正常写把。
5:下面是写解析权限的aop
package com.commons.utils.aop;
import java.lang.reflect.Method;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.commons.enums.OperationEnum;
import com.commons.enums.PathCommonEnum;
import com.commons.enums.PathKeyEnum;
import com.commons.utils.StringUtils;
import com.mag.pro.pojo.MasterAssembly;
import com.mag.pro.pojo.aop.Authority;
import com.mag.pro.pojo.aop.ManagerPermissions;
import com.mag.pro.pojo.exception.MyException;
import com.mag.pro.service.ManagerPermissionsService;
/**
* 解析权限注解
* @author think
*/
@Aspect
@Component
public class AnnotationParse {
@Autowired(required = false)
private HttpServletRequest request;
@Autowired(required = false)
private HttpSession session;
@Autowired
private ManagerPermissionsService managerPermissionsService;
@Pointcut("@annotation(com.mag.pro.pojo.aop.Authority)")
public void operationAuthority() {
}
@Around("operationAuthority()")
public Object selectAuth(ProceedingJoinPoint joinPoint)throws Throwable{
MyException myException = null;
String users_only_md5 = getUsersId(session);
Object result = "";//aop环绕返回值专用
//当url传递的参数(users_only_id)为空时,则判断出系统异常
//本来该判断是在controller里面处理的。但是环绕通知会优先执行,导致这里需要进行判断约束
/*if(StringUtils.isNullString(users_only_md5)){
System.out.println("usersid:"+users_only_md5);
myException = new MyException(PathKeyEnum.LOGONFAILURE.getKey(),PathKeyEnum.LOGONFAILURE.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}*/
//查询出用户所拥有的权限列表
List<ManagerPermissions> listManagerPermissions = managerPermissionsService.selectManagerPermissionsUsers(users_only_md5);
//当用户权限查询出来为null时,则定义为该用户没有权限
if(StringUtils.isListNull(listManagerPermissions)){
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
OperationEnum operationEnum = getControllerMethodDescription(joinPoint);
String controllerUrl = getUrl();
if(StringUtils.isNullString(controllerUrl)){
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
try{
//listManagerPermissions 当这个集合不为空时,循环判断str跟集合里的权限是否有存在。
for (int i = 0; i < listManagerPermissions.size(); i++) {
if(listManagerPermissions.get(i).getFunction_permissions_controller().equals(controllerUrl)){
if("SELECT".equals(operationEnum.getKey())){
if(listManagerPermissions.get(i).getFunction_select() == Integer.parseInt(operationEnum.getValue())){
result = joinPoint.proceed();
break;
}else{
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
}else if("UPDATE".equals(operationEnum.getKey())){
if(listManagerPermissions.get(i).getFunction_update() == Integer.parseInt(operationEnum.getValue())){
result = joinPoint.proceed();
break;
}else{
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
}else if("DELETE".equals(operationEnum.getKey())){
if(listManagerPermissions.get(i).getFunction_delete() == Integer.parseInt(operationEnum.getValue())){
result = joinPoint.proceed();
break;
}else{
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
}else if("INSERT".equals(operationEnum.getKey())){
if(listManagerPermissions.get(i).getFunction_add() == Integer.parseInt(operationEnum.getValue())){
result = joinPoint.proceed();
break;
}else{
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
}else if("DISABLE".equals(operationEnum.getKey())){
if(listManagerPermissions.get(i).getFunction_disable() == Integer.parseInt(operationEnum.getValue())){
result = joinPoint.proceed();
break;
}else{
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
}
}
}
} catch (Exception e) {
// TODO: handle exception
}
if("" == result){
myException = new MyException(PathKeyEnum.AUTHORITY.getKey(),PathKeyEnum.AUTHORITY.getValue(),PathCommonEnum.ERROR.getValue());
return myException.toBeanMap();
}
return result;
}
/**
* 解析注解上的权限
* @param joinPoint
* @return
*/
public static OperationEnum getControllerMethodDescription(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Authority controllerAuthority = method.getAnnotation(Authority.class);
OperationEnum discription = controllerAuthority.value();
return discription;
}
/**
* 根据用户登录的session获取id
* @param session
* @return
*/
private static String getUsersId(HttpSession session){
//这个是管理员表。上面我没有创建。同时管理员登录时,我将该用户的对象存放在session 所以这边要这样取
MasterAssembly masterAssembly = (MasterAssembly)session.getAttribute("masterAssembly");
if(StringUtils.isObjectNull(masterAssembly))
return PathCommonEnum.NULL.getValue();
return masterAssembly.getMaster_assembly_only_md5();
}
/**
* 截取url的controller
* @return
*/
private String getUrl(){
String url = request.getRequestURI();
if(!StringUtils.isNullString(url)){
return url.substring(12,url.lastIndexOf("/"));
}
return null;
}
}
这个方法其实就是得到一开始我们创建权限表时得到的拼音。即:
这个我们在数据库里已经写成这样的。
上面的一大段方法已经实现了权限的对比。
里面还涉及到异常类:
package com.mag.pro.pojo.exception;
import java.util.Map;
import com.commons.comm.JsonMethod;
/**
* 自定义异常
* @author think
*/
public class MyException extends RuntimeException{
private String code;
private String msg;
private Object entity;
public MyException(String code, String msg,Object entity) {
// TODO Auto-generated constructor stub
this.code = code;
this.msg = msg;
this.entity = entity;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getEntity() {
return entity;
}
public void setEntity(Object entity) {
this.entity = entity;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return JsonMethod.setJsonMethod(code, msg, entity).toString();
}
/**
* 权限不足
* 返回map格式
* @return
*/
public Map<String, Object> toBeanMap(){
return JsonMethod.setJsonMethod(code, msg, entity);
}
/**
* 参数不正确
* 返回map格式
* @return
*/
public Map<String, Object> toArgsUsersId(){
return JsonMethod.setJsonMethod(code, msg, entity);
}
}
JsonMethod.setJsonMethod 这个是我的工具类。主要返回json给前端
package com.commons.comm;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* JSON重载
* @author weily
* @author 2018-04-11
*/
public class JsonMethod {
/**
* JSON 封装(对象存储)
* @param code 返回装填
* @param msg 消息提示
* @param obj 内容展示
* @return
*/
public static Map<String, Object> setJsonMethod(String code,String msg,Object obj){
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", code);
map.put("msg", msg);
map.put("entity", obj);
return map;
}
/**
* JSON 封装(集合存储)
* @param code 返回装填
* @param msg 消息提示
* @param list 集合展示
* @return
*/
public static Map<String, Object> setJsonMethod(String code,String msg,List<Object> list){
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", code);
map.put("msg", msg);
map.put("entity", list);
return map;
}
}
6:下面就是controller怎么调用了
创建一个controller:
@Controller
@RequestMapping("QXSZ")//这个可以写表里面的随便一个来测试,记得要拼音一致。不能自己乱写
/**
* 获取新增管理员权限
* @param req
* @param res
* @return
*/
@Authority(OperationEnum.INSERT)
@OperLog(logDescription="获取新增管理员权限")
@RequestMapping(value="insertMaster",method={RequestMethod.GET,RequestMethod.POST})
@ResponseBody
public Map<String, Object> insertMaster(HttpServletRequest req,
HttpServletResponse res){
res.setCharacterEncoding("UTF-8");
return JsonMethod.setJsonMethod(PathKeyEnum.SUCCESS.getKey(), PathKeyEnum.SUCCESS.getValue(), PathCommonEnum.SUCCESS.getValue());
}
@Authority(OperationEnum.INSERT)//这个就是权限的调用。可以存放增删改查。根据需求来定。
如果我这个方法是select。则这边要写成select
如果该用户拥有权限。则会走方法里面的return,否则会走自定义异常里的return 抛出无权限
同时会问。我这里没参数。怎么知道是上面用户。其实上面的解析权限已经获取了用户的对象。因为我是将登录的对象存放
在session。那么你写登录方法时。可以将对象存放在session,如果自己单独存放,则需要修改上面获取用户的方法。
那么前端怎么调用呢?
前端在写ajax调用的时候,记得优先访问上面的controller权限方法。当返回是success:20000 时。则调用请求加载列表的方法(select)否则。alert()会提示无权限。
我这里的url就是获取权限。如果成功。则调用另写的ajax方法。
到这基本功能全部实现了。
记得xml里面配置下aop (log那个是aop日志,可以删除掉)
以上内容仅供参考!大家一起学习。