@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)servletRequest; HttpServletResponse response=(HttpServletResponse)servletResponse; String uri=request.getRequestURI(); //判断当前请求地址是否是登录地址 if(!uri.contains("sys/login_")){ //非登录请求 if(request.getSession().getAttribute(Constant.USER)!=null){ //说明已经登录过 //判断是否访问纳税服务子系统 if(uri.contains("/tax/")){ //说明访问纳税服务子系统 User user=(User)request.getSession().getAttribute(Constant.USER); PermissionCheck pc=new PermissionCheckImpl(); if(pc.isAccessible(user,"nsfw")){ //说明有权限,放行 chain.doFilter(request, response); }else{ //没有权限,跳转到没有权限提示界面 response.sendRedirect(request.getContextPath()+"/sys/login_toNoPermissionUI.action"); } }else{ //非访问纳税服务子系统,直接放行 chain.doFilter(request, response); } }else{ //没有登录,跳转到登录界面 response.sendRedirect(request.getContextPath()+"/sys/login_toLoginUI.action"); } }else{ //登录请求,直接放行 chain.doFilter(request, response); } }
package cn.edu.hpu.tax.core.permission; import cn.edu.hpu.tax.user.entity.User; public interface PermissionCheck { /** *判断用户是否有code对应的权限 * @param user 用户 * @param code 子系统的权限标识 * @return true or false */ public boolean isAccessible(User user,String code); }
package cn.edu.hpu.tax.core.permission.impl; import javax.annotation.Resource; import cn.edu.hpu.tax.core.permission.PermissionCheck; import cn.edu.hpu.tax.role.entity.Role; import cn.edu.hpu.tax.role.entity.RolePrivilege; import cn.edu.hpu.tax.role.service.RoleService; import cn.edu.hpu.tax.user.entity.User; import cn.edu.hpu.tax.user.service.UserService; public class PermissionCheckImpl implements PermissionCheck { @Resource private UserService userService; @Resource private RoleService roleService; @Override public boolean isAccessible(User user, String code) { //1.获取用户的所有角色 String[] ids=userService.getRoleIdByUserId(user.getId()); Role role=null; //2.根据每个角色对应的所有权限进行对比 for (int i = 0; i < ids.length; i++) { role=roleService.findObjectById(ids[i]); for (RolePrivilege rp:role.getRolePrivileges()) { //对比是否有code对应的权限 if(code.equals(rp.getId().getCode())){ //说明有权限,返回true return true; } } } return false; } }
//跳转到没有权限提示界面 public String toNoPermissionUI(){ return "noPermissionUI"; }
<result name="noPermissionUI">/WEB-INF/jsp/noPermissionUI.jsp</result>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>没有权限</title> </head> <body> 对不起!您没有访问此功能的权限;请联系系统管理员。 <a href="javascript:history.go(-1)">《《返回</a> </body> </html>
//登录 public String login(){ if(user!=null){ if(StringUtils.isNoneBlank(user.getAccount()) &&StringUtils.isNoneBlank(user.getPassword())){ //根据用户的账号和密码查询用户列表 List<User> list=userService.findUserByAccountAndPassword(user.getAccount(),user.getPassword()); if(list!=null&&list.size()>0){//说明登录成功 //1、登录成功 User user=list.get(0); //1.1、根据用户id查询用户的所有角色信息 String[] ids=userService.getRoleIdByUserId(user.getId()); List<Role> rolelist=new ArrayList<Role>(); for (int i = 0; i < ids.length; i++) { rolelist.add(roleService.findObjectById(ids[i])); } user.setRoles(rolelist); //1.2、将用户信息保存到session中 ServletActionContext.getRequest().getSession().setAttribute(Constant.USER, user); //1.3、将用户登录记录到日志文件 Log log=LogFactory.getLog(getClass()); log.info("用户名称为:"+user.getName()+"的用户登录了系统"); //1.4、重定向跳转到首页 return "home"; }else{ loginResult="账号或密码不正确!"; } }else{ loginResult="账号或密码不能为空!"; } }else{ loginResult="请输入账号和密码!"; } return toLoginUI(); }
然后修改PermissionCheckImpl的检查代码,让其不再去查询数据库。
package cn.edu.hpu.tax.core.permission.impl; import java.util.List; import cn.edu.hpu.tax.core.permission.PermissionCheck; import cn.edu.hpu.tax.role.entity.Role; import cn.edu.hpu.tax.role.entity.RolePrivilege; import cn.edu.hpu.tax.user.entity.User; public class PermissionCheckImpl implements PermissionCheck { @Override public boolean isAccessible(User user, String code) { //1.获取用户的所有角色 List<Role> rolelist=user.getRoles(); Role role=null; //2.根据每个角色对应的所有权限进行对比 for (int i = 0; i < rolelist.size(); i++) { role=rolelist.get(i); for (RolePrivilege rp:role.getRolePrivileges()) { //对比是否有code对应的权限 if(code.equals(rp.getId().getCode())){ //说明有权限,返回true return true; } } } return false; } }
@Override public void delete(Serializable id) { userDao.delete(id); //删除用户对应的所有权限 userDao.deleteUserRoleByUserId(id.toString()); }
//解决子框架嵌套的问题 if(window != window.parent){ window.parent.location.reload(true); }
至此,我们的权限鉴定和解决嵌套登录完成。
工程源代码下载:http://download.csdn.net/detail/u013517797/9246763
转载请注明出处:http://blog.csdn.net/acmman/article/details/49680255