基于URL的权限管理学习总结

来源:互联网 发布:电子板报设计软件 编辑:程序博客网 时间:2024/04/27 15:27

其实就是一个简单拦截器功能,通过session进行权限的控制
主要分了两步1.认证2.授权
这里写图片描述

1.认证的具体代码实现
配置拦截器

<mvc:interceptor>            <!-- 用户认证拦截 -->            <mvc:mapping path="/**" />            <bean class="cn.itcast.ssm.controller.interceptor.LoginInterceptor"></bean>        </mvc:interceptor>

cn.itcast.ssm.controller.interceptor.LoginInterceptor中的代码为

public boolean preHandle(HttpServletRequest request,            HttpServletResponse response, Object handler) throws Exception {        //得到请求的url        String url = request.getRequestURI();        //判断是否是公开 地址        //实际开发中需要公开 地址配置在配置文件中        //从配置中取匿名访问url,例如登录的url是必须要放行的        List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");        //遍历公开 地址,如果是公开 地址则放行        for(String open_url:open_urls){            if(url.indexOf(open_url)>=0){                //如果是公开 地址则放行                return true;            }        }        //判断用户身份在session中是否存在        HttpSession session = request.getSession();        ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");        //如果用户身份在session中存在放行        if(activeUser!=null){            return true;        }        //执行到这里拦截,跳转到登陆页面,用户进行身份认证        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);        //如果返回false表示拦截不继续执行handler,如果返回true表示放行        return false;    }

工具类ResourcesUtil.gekeyList(String baseName)

public static List<String> gekeyList(String baseName) {        Locale locale = getLocale();        ResourceBundle rb = ResourceBundle.getBundle(baseName, locale);        List<String> reslist = new ArrayList<String>();        Set<String> keyset = rb.keySet();        for (Iterator<String> it = keyset.iterator(); it.hasNext();) {            String lkey = (String)it.next();            reslist.add(lkey);        }        return reslist;    }

Controller层

@RequestMapping("/login")    public String login(HttpSession session, String randomcode,String usercode,String password)throws Exception{        //校验验证码,防止恶性攻击        //从session获取正确验证码        String validateCode = (String) session.getAttribute("validateCode");        //输入的验证和session中的验证进行对比         if(!randomcode.equals(validateCode)){            //抛出异常            throw new CustomException("验证码输入错误");        }        //调用service校验用户账号和密码的正确性        ActiveUser activeUser = sysService.authenticat(usercode, password);        //如果service校验通过,将用户身份记录到session        session.setAttribute("activeUser", activeUser);        //重定向到商品查询页面        return "redirect:/first.action";    }

Service的authenticat方法

public ActiveUser authenticat(String userCode, String password)            throws Exception {        /**    认证过程:    根据用户身份(账号)查询数据库,如果查询不到用户不存在    对输入的密码 和数据库密码 进行比对,如果一致,认证通过         */        //根据用户账号查询数据库        SysUser sysUser = this.findSysUserByUserCode(userCode);        if(sysUser == null){            //抛出异常            throw new CustomException("用户账号不存在");        }        //数据库密码 (md5密码 )        String password_db = sysUser.getPassword();        //对输入的密码 和数据库密码 进行比对,如果一致,认证通过        //对页面输入的密码 进行md5加密         String password_input_md5 = new MD5().getMD5ofStr(password);        if(!password_input_md5.equalsIgnoreCase(password_db)){            //抛出异常            throw new CustomException("用户名或密码 错误");        }        //得到用户id        String userid = sysUser.getId();        //根据用户id查询菜单         List<SysPermission> menus =this.findMenuListByUserId(userid);        //根据用户id查询权限url        List<SysPermission> permissions = this.findPermissionListByUserId(userid);        //认证通过,返回用户身份信息        ActiveUser activeUser = new ActiveUser();        activeUser.setUserid(sysUser.getId());        activeUser.setUsercode(userCode);        activeUser.setUsername(sysUser.getUsername());//用户名称        //放入权限范围的菜单和url        activeUser.setMenus(menus);        activeUser.setPermissions(permissions);        return activeUser;    }

mapper层就不写了

授权:
配置拦截器

<mvc:interceptor>            <!-- 授权拦截 -->            <mvc:mapping path="/**" />            <bean class="cn.itcast.ssm.controller.interceptor.PermissionInterceptor"></bean>        </mvc:interceptor>

拦截器

public boolean preHandle(HttpServletRequest request,            HttpServletResponse response, Object handler) throws Exception {        //得到请求的url        String url = request.getRequestURI();        //判断是否是公开 地址        //实际开发中需要公开 地址配置在配置文件中        //从配置中取逆名访问url        List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");        //遍历公开 地址,如果是公开 地址则放行        for(String open_url:open_urls){            if(url.indexOf(open_url)>=0){                //如果是公开 地址则放行                return true;            }        }        //从配置文件中获取公共访问地址        List<String> common_urls = ResourcesUtil.gekeyList("commonURL");        //遍历公用 地址,如果是公用 地址则放行        for(String common_url:common_urls){            if(url.indexOf(common_url)>=0){                //如果是公开 地址则放行                return true;            }        }        //获取session        HttpSession session = request.getSession();        ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");        //从session中取权限范围的url        List<SysPermission> permissions = activeUser.getPermissions();        for(SysPermission sysPermission:permissions){            //权限的url            String permission_url = sysPermission.getUrl();            if(url.indexOf(permission_url)>=0){                //如果是权限的url 地址则放行                return true;            }        }        //执行到这里拦截,跳转到无权访问的提示页面        request.getRequestDispatcher("/WEB-INF/jsp/refuse.jsp").forward(request, response);        //如果返回false表示拦截不继续执行handler,如果返回true表示放行        return false;    }
0 0
原创粉丝点击