@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";
}
/WEB-INF/jsp/noPermissionUI.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
没有权限
对不起!您没有访问此功能的权限;请联系系统管理员。
《《返回
//登录
public String login(){
if(user!=null){
if(StringUtils.isNoneBlank(user.getAccount())
&&StringUtils.isNoneBlank(user.getPassword())){
//根据用户的账号和密码查询用户列表
List 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 rolelist=new ArrayList();
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 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