ssm系统拦截权限

1.系统权限的拦截

​ 对于一个系统来说,系统当中的不同用户访问资源的权限也是不同的

​ 对于系统来说,用户,角色,权限必不可少,通常都是通过5张表来实现系统的权限控制

​ 用户表,用户角色关系表,角色表,角色权限关系表,权限表(菜单表)

  1. 不同的用户登陆,进来之后,看到的导航是一样的吗?
    • 用户登陆成功后,根据用户id查询他的权限列表,动态的展示导航
  2. 怎么保证不同的用户,不能操作不属于他的权限?
    • 全局的拦截器拦截每次请求,先判断请求资源地址是否是公开资源,如果不是,
    • 判断用户是否登陆,假如登陆,通过用户id查询到用户的权限列表list,
    • 拿着用户请求的资源地址和list进行对比,如果包含在其中,放行;

2.代码实现

  1. 自定义权限拦截器
package com.oracle.shop.security;

import com.oracle.shop.po.Menu;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 *@Description: 权限拦截器
 */
public class PremisstionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //在请求处理之前判断用户请求的地址是否合法,如果不合法就执行响应的操作
        //获取请求路径
        String path = request.getRequestURI();
        if (path.contains("/common")){
            //请求公共资源
            return true;
        }else {
            //访问非静态资源 判断用户是否登陆
            HttpSession session = request.getSession(false);
            if (null==session){//一定没有登陆
                response.sendRedirect(request.getContextPath()+"/common/toLogin");
                return false;
            }else {
                if (null==session.getAttribute("user")){
                    //用户没有登陆过
                    response.sendRedirect(request.getContextPath()+"/common/toLogin");
                    return false;
                }else{
                    //用户登陆了,判断请求是否合法
                    //获取用户权限下,可以访问的页面列表
                    if (path.contains("/index")){
                        return true;
                    }else {
                        List<Menu> menuList = (List<Menu>)session.getAttribute("menuList");
                        //遍历查看请求是否合法
                        boolean check = false;
                        for (Menu menu:menuList){
                            if (path.contains(menu.getMenuKey())){
                                check = true;
                                break;
                            }
                        }
                        if (check){
                            return true;
                        }else {
                            response.sendRedirect(request.getContextPath()+"/common/noauth");
                            return false;
                        }
                    }
                }
            }
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

  1. 在springmvc.xml当中配置拦截器
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截的路径所有-->
            <mvc:mapping path="/**"/>
            <!--不拦共同资源-->
            <mvc:exclude-mapping path="/common"/>
            <bean class="com.oracle.shop.security.PremisstionInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
posted @ 2021-11-06 12:55  2333gyh  阅读(107)  评论(0)    收藏  举报