用户登录成功根据用户角色从数据库查询用户的操作权限(操作链接),可以进行权限拦截校验,并将操作权限存储至session中,在拦截器中获取用户的操作权限,用户请求url时,如果url在权限操作内放行可以继续操作,如果不在这个范围内拦截,提示用户:无此操作权限。
权限拦截
常用的有过虑器方式、框架拦截器(springmvc拦截,struts拦截器等)
配置公共访问地址
公开访问地址在resources/commonActions.properties文件中进行配置。
权限拦截流程:
权限拦截器
/**
* 权限拦截器
* @author Thinkpad
*
*/
public class PermissionInterceptor implements HandlerInterceptor {
//进入action方法前要执行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
//用户访问地址:
String url = request.getRequestURI();
//判断是否公开权限,如果是放行
//获取公开地址
List<String> url_list_open= ResourcesUtil.gekeyList(Config.ANONYMOUS_ACTIONS);
//便利公开的地址,如果用户访问的地址url包括了公开的地址,则说明用户访问的地址就是公开的地址
for(String url_v:url_list_open){
if(url.contains(url_v)){
return true;//放行,用户继续访问
}
}
//校验用户访问的是否是公共权限
//获取公共权限地址
List<String> url_list= ResourcesUtil.gekeyList(Config.COMMON_ACTIONS);
//便利公开的地址,如果用户访问的地址url包括了公开的地址,则说明用户访问的地址就是公开的地址
for(String url_v:url_list){
if(url.contains(url_v)){
return true;//放行,用户继续访问
}
}
//从session获取用户权限信息
HttpSession session =request.getSession();
ActiveUser activeUser = (ActiveUser)session.getAttribute(Config.ACTIVEUSER_KEY);
//获取用户操作权限
List<Operation> operation_list = activeUser.getOperationList();
//校验用户访问地址是否在用户权限范围内
for(Operation operation:operation_list){
String url_operation = operation.getActionUrl();
if(url.contains(url_operation)){
return true;//放行,用户继续访问
}
}
//跳转到页面
request.getRequestDispatcher("/WEB-INF/jsp/base/refuse.jsp").forward(request, response);
return false;
}
//action方法执行完但返回视图前执行此方法
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
//action方法执行完且视图返回(渲染)完成执行此方法
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
在springmvc.xml文件中 配置拦截器链
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<!-- 用户身份校验的拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="yycg.base.filter.LoginInterceptor"></bean>
</mvc:interceptor>
<!--用户权限拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="yycg.base.filter.PermissionInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器抛出异常
由于本系统提交结果为json格式数据,页面上由js函数进行解析,如果这里拦截器重定向到一个页面会导致js函数无法正确解析,这里需要将:
request.getRequestDispatcher("/WEB-INF/jsp/base/refuse.jsp").forward(request, response);
//改为:
//105表示“没有操作权限”
ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 105, null));
异常处理器需要在处理返回页面方法中添加如下处理代码: