shiro学习笔记2——基于url的权限管理

5 基于url的权限管理

 5.1 基于url权限管理流程

 

 

5.2 搭建环境

 5.2.1数据库

mysql5.1数据库中创建表:用户表、角色表、权限表(实质上是权限和资源的结合 )、用户角色表、角色权限表。

 

完成权限管理的数据模型创建。

 

​​​​​​​5.2.2 开发环境

jdk1.7.0_72

eclipse 3.7 indigo

技术架构:springmvc+mybatis+jquery easyui

 

 

​​​​​​​​​​​​​​5.2.3 系统工程架构

springmvc+mybatis+jquery easyui

 

 

​​​​​​​​​​​​​​5.2.4 系统登陆

系统 登陆相当 于用户身份认证,用户成功,要在session中记录用户的身份信息.

 

操作流程:

用户进行登陆页面

输入用户名和密码进行登陆

进行用户名和密码校验

如果校验通过,在session记录用户身份信息

 

 

​​​​​​​​​​​​​​5.2.4.1 用户的身份信息

创建专门类用于记录用户身份信息。

 

​​​​​​​​​​​​​​5.2.4.2 mapper

mapper接口: 根据用户账号查询用户(sys_user)信息(使用逆向工程生成的mapper)

使用逆向工程生成以下表的基础代码:

 

 

​​​​​​​​​​​​​​5.2.4.3 service(进行用户名和密码校验)

接口功能:根据用户的身份和密码 进行认证,如果认证通过,返回用户身份信息

认证过程:

根据用户身份(账号)查询数据库,如果查询不到用户不存在

对输入的密码 和数据库密码 进行比对,如果一致,认证通过

 

 

​​​​​​​​​​​​​​5.2.4.4 controller(记录session)

 

 

​​​​​​​​​​​​​​5.2.5 用户认证拦截器

 

​​​​​​​ 5.2.5.1 anonymousURL.properties

配置可以匿名访问的url

 

 

 

​​​​​​​​​​​​​​5.2.5.2 编写认证拦截器

 

//用于用户认证校验、用户权限校验

@Override

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;

}

}

 

 

//判断用户身份在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;

}

 

​​​​​​​​​​​​​​5.2.5.3 配置拦截器

在springmvc.xml中配置拦截器

 

​​​​​​​5.2.6 授权

 

​​​​​​​​​​​​​​ 5.2.6.1 commonURL.properties

在此配置文件配置公用访问地址,公用访问地址只要通过用户认证,不需要对公用访问地址分配权限即可访问。

 

 ​​​​​​​5.2.6.2 获取用户权限范围的菜单

思路:

在用户认证时,认证通过,根据用户id从数据库获取用户权限范围的菜单,将菜单的集合存储在session中。

mapper接口:根据用户id查询用户权限的菜单

 

 

service接口:根据用户id查询用户权限的菜单

 

​​​​​​​​​​​​​​5.2.6.3 获取用户权限范围的url

 

思路:

在用户认证时,认证通过,根据用户id从数据库获取用户权限范围的url,将url的集合存储在session中。

 

mapper接口:根据用户id查询用户权限的url

 

 

service接口:根据用户id查询用户权限的url

 

​​​​​​​​​​​​​​5.2.6.4 用户认证通过取出菜单和url放入session

修改service认证代码:

 

​​​​​​​​​​​​​​5.2.6.5 菜单动态显示

修改first.jsp,动态从session中取出菜单显示:

 

​​​​​​​​​​​​​​5.2.6.6 授权拦截器

 

//在执行handler之前来执行的

//用于用户认证校验、用户权限校验

@Override

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;

}

 

 

​​​​​​​​​​​​​​5.2.6.7 配置授权拦截器

注意:将授权拦截器配置在用户认证拦截的下边。

​​​​​​​​​​​​​​5.3 小结​​​​​​​

使用基于url拦截的权限管理方式,实现起来比较简单,不依赖框架,使用web提供filter就可以实现。

问题:

需要将所有的url全部配置起来,有些繁琐,不易维护,url(资源)和权限表示方式不规范。

猜你喜欢

转载自blog.csdn.net/xinpz/article/details/81323970