本小结讲解,点击菜单进行页面跳转,看下图,点击管理员列表后会被认证拦截器首先拦截,验证用户是否登录,如果登录就放行,紧接着会被权限验证拦截器再次拦截,拦截的时候,会根据URL地址上找到对应的方法,然后查询方法上标注的自定义权限注解,紧接着根据当前登录用户查询出所有权限列表,然后进行验证,如果包含对应注解中的权限代码,就放行,否则提示或者跳转到404.

 /**
* 进入管理用户列表页面
* @return
*/
@AccessPermissionsInfo("admin:list")
@RequestMapping(value = "/admin-user-list.action",method = RequestMethod.GET)
public String adminUserListPage(HttpSession session,Model model){ //获取session用户是否存在
AdminUser adminUser = (AdminUser)session.getAttribute("adminUser");
if(adminUser!=null){
//根据用户名查询出该用户所有拥有的权限集合,
//这个权限集合查询出来了的集合是一个String集合,查询出来只有一列数据permission.code
List<String> permissions =
permissionService.findAllPermissionByLoginName(adminUser.getLoginName());
model.addAttribute("permissions",permissions);
}
return "admin-user-list"; }

拦截器的拦截过程如下图:

AuthorizationInterceptor类:
package com.supin51.interceptor;

import com.supin51.domain.AdminUser;
import com.supin51.service.PermissionService;
import com.supin51.utils.AccessPermissionsInfo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List; /**
* @Author:ShaoJiang
* @description: 权限认证拦截器
* @Date: created in 下午1:43 2019/1/21
* @Modified By:
*/
public class AuthorizationInterceptor implements HandlerInterceptor { private static final Log logger = LogFactory.getLog(AuthorizationInterceptor.class); @Autowired
private PermissionService permissionService; /*
* return true 才会继续执行下列两个方法(请求继续),否则整个请求结束
* 该方法主要进行拦截处理,该方法在Controller处理之前调用,
* */
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { //获取请求的路径进行判断
String servletUrl = request.getServletPath();
logger.info("权限认证拦截器:preHandle-------->"+servletUrl); //是否授权,默认为未授权
boolean isAuthorize = false; //如果方法上有权限注释
if(handler.getClass().isAssignableFrom(HandlerMethod.class))
{
AccessPermissionsInfo permissionsInfo =
((HandlerMethod)handler).getMethodAnnotation(AccessPermissionsInfo.class); if (permissionsInfo==null||permissionsInfo.value()=="")
{
isAuthorize = true;
logger.info("权限认证拦截器:preHandle-------->不需要权限,可以访问");
}else
{
String permission = permissionsInfo.value().toString();
logger.info("权限认证拦截器:preHandle-------->需要权限:"+permission+"才可以访问");
//获取session中的用户信息
AdminUser adminUser = (AdminUser)request.getSession().getAttribute("adminUser");
//如果用户已登录,放行,否则拦截
if(adminUser!=null){
//根据用户名查询出该用户所有拥有的权限集合
List<String> permissions =
permissionService.findAllPermissionByLoginName(adminUser.getLoginName());
//判断权限集合中的URL字段是否包含请求的路径,如果包含就放行,否则引导至提示(权限不足,请联系管理员)页面 for(String s:permissions)
{
if(permission.contains(s)){
isAuthorize = true;
logger.info("权限认证拦截器:preHandle-------->当前登录用户:"+adminUser.getLoginName()+"有"+permission+"访问权限,验证通过");
break;
}
}
}
} } if(!isAuthorize){
logger.info("权限认证拦截器:preHandle-------->权限不足或者无法访问该资源");
//转发至404页面
request.getRequestDispatcher("/404").forward(request,response);
} return isAuthorize; } @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("权限认证拦截器:postHandle-------->");
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("权限认证拦截器:afterCompletion-------->");
}
}

自定义注解类

package com.supin51.utils;

import java.lang.annotation.*;

/**
* @Author:ShaoJiang
* @description:自定义权限注解,用于注解在controller方法上,在拦截器中拦截用户是否有权限访问
* @Date: created in 下午8:44 2019/1/22
* @Modified By:
*/
@Inherited
@Target(ElementType.METHOD)//用于方法上的注解
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessPermissionsInfo { /**
* 权限名称值
* @return 权限名称
*/
String value() default ""; }

持久层PermissionMapper.xml

<!--这个方法获取的权限返回列只有一个code字段,主要用在了拦截器和页面上的按钮权限控制显示-->
<!--对应PermissionDao接口中的findAllPermissionByLoginName方法-->
<select id="findAllPermissionByLoginName" parameterType="string" resultType="string" >
SELECT tp.code
FROM t_admin ta
LEFT JOIN t_admin_role tar
ON tar.adminId = ta.id
LEFT JOIN t_role tr
ON tar.roleId = tr.id
LEFT JOIN t_role_permission trp
ON trp.roleId = tr.id
LEFT JOIN t_permission tp
ON tp.id = trp.permissionId
WHERE ta.loginName = #{loginName}
AND tp.url IS NOT NULL
</select>

页面成功跳转显示以后,在页面通过了EL表达式和jstl标签控制三级菜单权限按钮的显示,如下图:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <c:set var="permiss" value="${permissions}"/>
<c:if test="${fn:contains(permiss,'admin:add')}" >
<a href="javascript:;" onclick="admin_add('添加管理员','/admin/admin-user-add.action',null,'800px','500px')" class="btn btn-primary radius">
<i class="Hui-iconfont Hui-iconfont-user-add"></i> 添加</a>
</c:if>
<c:if test="${fn:contains(permiss,'admin:edit')}" >
<a href="javascript:;" onclick="admin_edit('编辑管理员','/admin/admin-user-edit.action',null,'800px','500px')" class="btn btn-primary radius">
<i class="Hui-iconfont Hui-iconfont-edit"></i> 编辑</a>
</c:if>
<c:if test="${fn:contains(permiss,'admin:delete')}" >
<a href="javascript:;" onclick="deleteAll()" class="btn btn-danger radius">
<i class="Hui-iconfont Hui-iconfont-del"></i> 删除</a>
</c:if>
<c:if test="${fn:contains(permiss,'admin:enable')}" >
<a href="javascript:;" onclick="admin_start()" class="btn btn-success radius">
<i class="Hui-iconfont Hui-iconfont-jiesuo"></i> 解锁</a>
</c:if>
<c:if test="${fn:contains(permiss,'admin:disable')}" >
<a href="javascript:;" onclick="admin_stop()" class="btn btn-danger radius">
<i class="Hui-iconfont Hui-iconfont-suoding "></i> 冻结</a>
</c:if>
<c:if test="${fn:contains(permiss,'admin:pwdReset')}" >
<a href="javascript:;" onclick="admin_user_password_reset()" class="btn btn-danger radius">
<i class="Hui-iconfont Hui-iconfont-zhongzuo"></i> 重置密码</a>
</c:if>

使用tom账户测试权限拦截,可以看到tom的角色在未分组里,而未分组里面什么权限也没有,当tom登录后,也看不到任何的菜单,如果强行通过网址URL进行方法,认证拦截器首先会进行验证是否登录,如果登录就放行到下一个拦截器,权限拦截器开始验证用户tom是否具有这个访问url的方法的访问权限,如果有就放行,如果没有就拦截。如下图所示:

到本小节结束,登录认证和权限验证已经全部完成。下一小节将讲解添加用户(添加用户的同时也要给用户分配角色,然后插入的到用户和角色的中间表)和添加角色(添加角色的同时也要给角色分配权限,然后插入到角色和权限的中间表)。

 

JavaEE权限管理系统的搭建(六)--------使用拦截器实现菜单URL的跳转权限验证和页面的三级菜单权限按钮显示的更多相关文章

  1. JavaEE权限管理系统的搭建(四)--------使用拦截器实现登录认证和apache shiro密码加密

    RBAC 基于角色的权限访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个 ...

  2. IDEA项目搭建十一——添加拦截器、忽略URL大小写、启动事件

    程序启动时如果需要添加某些初始化代码可以使用以下事件处理 import org.springframework.context.ApplicationEvent; import org.springf ...

  3. JavaEE权限管理系统的搭建(一)--------项目中用到的知识点概括

    转战Java有一段时间了,.net 已不再开发的新的工程,基本上在维护,最近大半年时间在学习Java,今天抽空将学习的到的知识,应用到了一个权限管理系统的小项目中,特此记录一下.代码如有不对之处,希望 ...

  4. JavaEE权限管理系统的搭建(三)--------springmvc和mabatis整合环境搭建

    本节介绍如何环境的搭建和配置: 首先要在父工程引入jar包依赖: <!-- 通过属性定义指定jar的版本 --> <properties> <spring.version ...

  5. JavaEE权限管理系统的搭建(八)--------角色的增删改

    如下图所示,添加角色的同时,要给角色分配权限菜单,关于权限数的显示,我实现了两种方式,普通方式和Ztree方式, 普通方式展示树: 主要代码部分: /** * 进入角色添加页面 * @param mo ...

  6. JavaEE权限管理系统的搭建(五)--------RBAC权限管理中的权限菜单的显示

    上一小节实现了登录的实现,本小节实现登录后根据用户名查询当前用户的角色所关联的所有权限,然后进行菜单的显示.登录成功后,如下图所示,管理设置是一级菜单,管理员列表,角色管理,权限管理是二级菜单. 先来 ...

  7. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十六节--SignalR与ABP框架Abp.Web.SignalR及扩展

    SignalR简介 SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  9. JavaEE开发之SpringMVC中的自定义拦截器及异常处理

    上篇博客我们聊了<JavaEE开发之SpringMVC中的路由配置及参数传递详解>,本篇博客我们就聊一下自定义拦截器的实现.以及使用ModelAndView对象将Controller的值加 ...

随机推荐

  1. GoLang爬取花瓣网美女图片

    由于之前一直想爬取花瓣网(http://huaban.com/partner/uc/aimeinv/pins/) 的图片,又迫于没时间,所以拖了很久. 鉴于最近在学go语言,就刚好用这个练手了. 预览 ...

  2. pat02-线性结构2. 一元多项式求导 (25)

    02-线性结构2. 一元多项式求导 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 设计函数求一元多项式的导数.(注:xn(n为整 ...

  3. 九度oj题目1181:遍历链表

    题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2600 解决:1125 题目描述: 建立一个升序链表并遍历输出. 输入: 输入的每个案例中第一行包括1个整数:n(1 ...

  4. nyoj 364——田忌赛马——————【贪心】

    田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Here is a famous story in Chinese history. "That ...

  5. WCF入门教程通信(二)

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...

  6. 安装 VS 2015 Update 2 + Windows SDK Tools 1.3.1 + Windows SDK 10586.212 后提示找不到 10586.0 SDK 问题的解决方法

    将 Visual Studio 2015 升级到 Update 2,并安装 Windows SDK Tools 1.3.1 和 Windows SDK 10586.212 后,有可能造成原本已安装的 ...

  7. go语言中文处理

    中文在go语言中占三个字节,len 或者 range 一个含中文的字符串跟我们预期的结果不一样 求长度用 utf8.RuneCountInString,遍历用 rune func main() { t ...

  8. Java使用TCP聊天程序

    前面使用了UDP进行通信的聊天程序 现在做一个用TCP进行通信的聊天程序 原理: ServerSocket Socket 1.开一个线程监听端口,准备接收消息 2.不断接受消息发送到目的端口 P.S. ...

  9. Spring课程 Spring入门篇 5-1 aop基本概念及特点

    概念: 1 什么是aop及实现方式 2 aop的基本概念 3 spring中的aop 1 什么是aop及实现方式 1.1 aop,面向切面编程,比如:唐僧取经需要经过81难,多一难少一难都不行.孙悟空 ...

  10. 响应式 Web 设计 - Viewport 和手机变框变粗的问题

    一个常用的针对移动网页优化过的页面的 viewport meta 标签大致如下: <meta name="viewport" content="width=devi ...