SSM框架Filter登录后对权限进行甄别,没有权限不可访问指定页面

之前写了关于SSM框架中利用Filter不登陆拦截访问

如果用户没有登录直接访问的话

所有请求全部转到登录页面登录才可访问

以此实现了初步的安全管理

之前去面试也是被问到了这个问题

ps:讲真,现在真的有好多安全控件儿,用这个的还能有多少

好吧,作为基础,毕竟笔者也是新人一枚

话说回来,讲到之前面试被问到这个问题

也就是,在登录成功之后,那么后续的

比如一些只有leader才能使用的管理页面怎么去拦截呢

总不能你登录之后,从某些渠道得到了内页的登录地址

然后直接输入地址就可以访问内页了?

当然是不可能的

今天更新:小白篇:关于内页访问的权限校验

当然还是使用Filter....毕竟别的笔者是真的不会啊,哈哈哈哈

上代码:以之前的登录拦截为基础

SSM框架利用Filter实现页面不登陆拦截,禁止跳过登录强制访问

今日代码:

 
public class UrlFilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO 对全栈url进行过滤
		//将request和response对象强转为http类型
		HttpServletRequest req=(HttpServletRequest)request;
		HttpServletResponse resp = (HttpServletResponse)response;
		
		//获取访问的地址
		String url = req.getRequestURI();
		//允许所有人访问的地址,全部定义到数组中
		String[] urls={"tologin.do","login.do","error.do","logout.do","top.do","left.do","right.do"};
		//用来判断用户当前访问地址是否在不登陆可访问的权限内
		boolean contains=true;
		for(String u:urls){
			//url的截取7:因为我的uri根中是 “/dscms/” 共七个字符,根据个人情况,如果没有,不用截取
			if(url.substring(7).equals(u)){
				contains=false;
			}
		}
		//获取session中的对象判断是否登录
		//拦截所有的 .do 请求但不包含tologin.do
		//jsp文件已经封装到webinf下 不用过滤 之过滤 .do请求即可
		if(url.contains(".do")&contains) {
			//获取session
			HttpSession session = req.getSession();
			TUser user=(TUser) session.getAttribute("USER");
			
			if(user==null){//如果用户为空,说明没有登录,返回到登录页面
				resp.sendRedirect("/dscms/tologin.do");
				chain.doFilter(req, resp);
			}else {//用户不为空,说明用户登录了,访问网址的时候验证权限
			    //验证权限,如果当前访问地址没有在用户权限范围内提示地址错误
                if(chkPermission(req)){
                    //继续执行过滤连的剩余部分
                    chain.doFilter(req, resp);
                }else {
                	//没有权限访问,返回错误代码或者自己定义的错误页面
                	resp.sendError(404);
                    //resp.sendRedirect("../error.do");
					chain.doFilter(req, resp);
                }
            }
			
		}

		chain.doFilter(req, resp);

	}
	//判断当前地址权限是否在用户权限范围内
	private boolean chkPermission(HttpServletRequest request){
        //1、获取用户当前访问的uri
        String uri=request.getRequestURI().substring(7);
            //1.1 判断当前uri访问需要的权限id
			//截取当前uri对应的权限地址并查询
			//根据权限地址查询权限id
		System.out.println(uri);
		//获取permission实例:filter中是无法自动注入的,因为这样生成两个该filter的实例A和B(A:tomcat之类的容器管理,B为spring管理)

        //2、获取当前用户的权限集合
		TUser user=(TUser)request.getSession().getAttribute("USER");
		List<TPermission> permissions = user.getPermissions();
		//遍历用户当前权限列表,判断权限
		for(TPermission pers:permissions) {
			if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){
				if (pers.getUrl().equals(uri)) {
					//2.1 、判断,如果当前uri的id在用户权限集合中返回true
					return true;
				}
			}

		}
		//2.2、 如果不在权限中,返回false
		return false;

    }

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

之前的文章上面也发出来了

今天用的还是以之前的Filter类作为基础

在用户登录之后,继续加了一层验证

也就是在判断用户已经登录之后

 
if(user==null){//如果用户为空,说明没有登录,返回到登录页面
				resp.sendRedirect("/dscms/tologin.do");
				chain.doFilter(req, resp);
			}else {//用户不为空,说明用户登录了,访问网址的时候验证权限
			    //验证权限,如果当前访问地址没有在用户权限范围内提示地址错误
                if(chkPermission(req)){
                    //继续执行过滤连的剩余部分
                    chain.doFilter(req, resp);
                }else {
                	//没有权限访问,返回错误代码或者自己定义的错误页面
                	resp.sendError(404);
                    //resp.sendRedirect("../error.do");
					chain.doFilter(req, resp);
                }
            }

也就是这里继续校验

下面封装了一个chkPermission()方法

如果写在一起实在显得臃肿

 
//判断当前地址权限是否在用户权限范围内
	private boolean chkPermission(HttpServletRequest request){
        //1、获取用户当前访问的uri
        String uri=request.getRequestURI().substring(7);
            //1.1 判断当前uri访问需要的权限id
			//截取当前uri对应的权限地址并查询
			//根据权限地址查询权限id
		System.out.println(uri);
		//获取permission实例:filter中是无法自动注入的,因为这样生成两个该filter的实例A和B(A:tomcat之类的容器管理,B为spring管理)

        //2、获取当前用户的权限集合
		TUser user=(TUser)request.getSession().getAttribute("USER");
		List<TPermission> permissions = user.getPermissions();
		//遍历用户当前权限列表,判断权限
		for(TPermission pers:permissions) {
			if(pers.getUrl()!=null&&!"".equals(pers.getUrl())){
				if (pers.getUrl().equals(uri)) {
					//2.1 、判断,如果当前uri的id在用户权限集合中返回true
					return true;
				}
			}

		}
		//2.2、 如果不在权限中,返回false
		return false;

    }

开始的时候本来是想要去校验权限的id,但是后来发现其实用substring去截取着实更简单一点(字符串真的操作真的很重要)平时要常看看

还有一点:filter中是不能使用Autowired的,如果需要使用注入的话,可以如下

 
        ServletContext context = request.getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
        SessionService sessionService = ctx.getBean(SessionService.class);

还记得这个把,刚开始接触spring的时候

通过been.xml去过去,怎么说呢,手动配置加载这样

用框架多了,很多以前的基础都忘了

基础其实才是最重要的,框架千万种,万变不离其宗

只要基础牢固,什么框架都不在话下

可是要是你只会框架,恐怕到时候真的遇到问题就真的老大难咯

最后:关于权限还有部分没有实现——关于部分用户拥有只读权限,部分用户拥有全部操作权限这部分,个人想法是在权限表中在多加一个字段,验证的时候去验证具体 只读/操作,不知道大家有没有什么更好的办法,欢迎评论区讨论留言哈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值