`
我是温浩然
  • 浏览: 95468 次
文章分类
社区版块
存档分类
最新评论

自定义单点登录项目 (1)

 
阅读更多

这是(1),打算写一个系列

惯例,

我是温浩然:

上一个月,研究了两个周的CAS单点登录。因为是发布到阿里云服务器上,项目中的证书文件,与阿里云服务器冲突,所以,就自己写了一套单点登录页面。

先说一下需求。

1、用户在访问系统时,需要进行验证,该资源是否是受保护的资源,如果不是,可以继续访问,(比如开放的接口,登录页面,退出页面,都不是受保护的。)

2、如果访问的请求是受保护的,再进行验证,当前用户是否已经登录,如果没有登录,进行拦截,跳转登录页面,如果已经登录,进行权限验证,如果有权限访问当前页面,则继续访问,如果没有权限,跳转权限限制页面。

3、在登录页面,进行登录,这个应该是比较简单的。就是登录的一套东西了,验证用户名密码是否正确等。

……

需求什么的,都没什么特别麻烦的。

在写这个的项目的时候,学到了很多东西。

1、web.xml拦截器中,过滤和拦截,以前接触的比较少。下面贴代码。这个过滤和拦截,在Filter中定义,应该都知道。

<filter><!-- com.tujia.core.filter.SecurityFilter -->
		<filter-name>securityFilter</filter-name>
		<filter-class>com.tujia.core.filter.SecurityFilter</filter-class>
		<init-param>
			<param-name>ignores</param-name><!-- /tbk,这里配置的,是忽略拦截的。 -->
			<param-value>/app/appNavs,/app/download,/tulogin,/tulogout,/static,/img/select</param-value>
		</init-param>
		<!-- <init-param> 这个忽略的是,拦截的部分,
			<param-name>checks</param-name>/tbk,
			<param-value>/,/app/,/video/</param-value>
		</init-param> -->
	</filter>
	
	 <filter-mapping>
		<filter-name>securityFilter</filter-name>
		<url-pattern>*</url-pattern>
	</filter-mapping>

2、下面贴Filter的代码。

package com.tujia.core.filter;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;

import com.tujia.common.exception.UnAuthedException;
import com.tujia.core.security.SecurityUtil;

public class SecurityFilter implements Filter {

	private Set<String> prefixIignores = new HashSet<String>();
	private Set<String> prefixChecks = new HashSet<String>();
	
	private SecurityUtil securityUtil;
	
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;

		if (canIgnore(request)) {
			chain.doFilter(req, res);
			return;
		}
		
		/*if (!needCheck(request)) {
			chain.doFilter(req, res);
			return;
		}*/
		
		try {
			//
			boolean validUser = securityUtil.authenticate(request, response);// 进行登录认证...
			
			if (!validUser) {//判断是否登录。否,跳转登录页面,
				String cp = request.getContextPath();
				response.sendRedirect(cp+"/tulogin");
				return;
			}

			chain.doFilter(req, res);//已经登录
		} catch (UnAuthedException e) {
			e.printStackTrace();
		} finally {
			SecurityUtil.clearOnThreadOver();
		}

	}

	public void init(FilterConfig config) throws ServletException {

		ServletContext servletContext = config.getServletContext();
		WebApplicationContext ap = (WebApplicationContext) servletContext
				.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		securityUtil = (SecurityUtil) ap.getBean("securityUtil");
		
		String cp = config.getServletContext().getContextPath();
		String ignoresParam = config.getInitParameter("ignores");
		//String checksParam = config.getInitParameter("checks");
		String[] ignoreArray = ignoresParam.split(",");
		//String[] checksArray = checksParam.split(",");
		for (String s : ignoreArray) {
			prefixIignores.add(cp + s);
		}
		
		/*for (String s : checksArray) {
			prefixChecks.add(cp + s);
		}*/
	}

	@Override
	public void destroy() {
		prefixIignores = null;
	}

	private boolean canIgnore(HttpServletRequest request) {
		String url = request.getRequestURI();
		for (String ignore : prefixIignores) {
			if (url.startsWith(ignore)) {
				return true;
			}
		}
		return false;
	}
	
	private boolean needCheck(HttpServletRequest request) {
		String url = request.getRequestURI();
		for (String ignore : prefixChecks) {
			if (url.startsWith(ignore)) {
				return true;
			}
		}
		return false;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics