Spring Aop 权限开发(Java后台管理权限) (完整版)

之前写过一个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日志,可以删除掉)

以上内容仅供参考!大家一起学习。

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值