1.1
搭建环境

1.1.1
数据库

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

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

1.1.2
开发环境

jdk1.7.0_72

eclipse 3.7 indigo

技术架构:
springmvc+mybatis+jquery easyui

1.1.3
系统工程架构

springmvc+mybatis+jquery easyui

1.1.4
系统登陆

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

操作流程:

用户进行登陆页面

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

进行用户名和密码校验

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

1.1.1.1
用户的身份信息

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

1.1.1.2
mapper

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

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

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

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

认证过程:

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

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

1.1.1.4
controller
(记录
session

1.1.1
用户认证拦截器

1.1.1.1
anonymousURL.properties

配置可以匿名访问的
url

1.1.1.2
编写认证拦截器

//用于用户认证校验、用户权限校验
@Overridepublic booleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throwsException {//得到请求的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;
}

1.1.1.3
配置拦截器


springmvc.xml
中配置拦截器

1.1.2
授权

1.1.2.1
commonURL.properties

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

1.1.2.2
获取用户权限范围的菜单

思路:

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

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

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

1.1.2.3
获取用户权限范围的
url

思路:

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

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

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

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

修改
service
认证代码:

1.1.2.5
菜单动态显示

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

1.1.2.6
授权拦截器

//在执行handler之前来执行的//用于用户认证校验、用户权限校验
@Overridepublic booleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throwsException {//得到请求的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;
}

1.1.2.7
配置授权拦截器

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

1.1
小结

只保护到菜单,页面里面的
操作没有权限管控,那么有人直接在浏览器输入这个地址即可进入这个页面。

使用基于
url
拦截的权限管理方式,实现起来比较简单,不依赖框架

不用
spring
的拦截器也可以

,使用
web
提供
filter
就可以实现。
目前也是基于资源,但是不够细。

问题:

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

标签: none

添加新评论