关闭

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

标签: 单点登录自定义单点登录
597人阅读 评论(0) 收藏 举报
分类:

这是(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;
	}
}


0
0
查看评论

单点登录详解(一)--使用Cookie+Filter实现单点登录

单点登陆分两种,一种是系统之间一级域名相同,如www.bbs.itcast.cn及www.news.itcast.cn这两个域名,一级域名(itcast.cn)相同,这两个系统可以拿到对方的cookie,通过cookie+Filter就能实现单点登录,另一种,如www.bbs.com及www.new...
  • u013213157
  • u013213157
  • 2017-08-21 22:54
  • 224

CAS单点登录项目实战(1)

CAS单点登录项目实战——基础入门一、项目背景       企业的信息化过程是一个循序渐进的过程,在企业各个业务网站逐步建设的过程中,根据各种业务信息水平的需要构建了相应的应用系统,由于这些应用系统一般是在不同的时期开发完成的,各...
  • jdk2006
  • jdk2006
  • 2015-06-29 13:30
  • 996

在Tomcat中配置单点登录

单点登录:Single Sign-On 1、概述   一旦你设置了realm和验证的方法,你就需要进行实际的用户登录处理。一般说来,对用户而言登录系统是一件很麻烦的事情,你必须尽量减少用户登录验证的次数。作为缺省的情况,当用户第一次请求受保护的资源时,每一个Web应用都会要求用户...
  • u011794238
  • u011794238
  • 2015-03-04 15:24
  • 954

自定义单点登录页面--在自己的网站使用单点登录(2)

因最近经常有时候被一些朋友问到关于 CAS 跨全域下的 Ajax 登录方式实现,正好之前也分析Sina微博的SSO实现,文中也说了 SINA 的 SSO 实际上(或机制)直接使用了 CAS 这个开源项目。于是本文中要说的CAS AJAX登录方式便参考了 SINA 的AJA...
  • scubers
  • scubers
  • 2015-05-21 13:57
  • 1756

(实战项目)SSO单点登录

SSO单点登录公司项目需要大量集成,使用单点登录进行统一用户管理(不使用https,因为证书的提示框对于用户来说真是..) 项目地址: SSO(Cas-4.0分支)maven版本在分支 maven(cas-4.0)maven版本说明:(推荐) 添加验证码 自定义登录页 自定义返回多数据 集成re...
  • qqqqq210
  • qqqqq210
  • 2016-11-08 14:25
  • 988

项目中访单点登录的实现

,要求是由主系统增加一个从系统的链接,由主系统登录成功的用户可以直接点击该链接而登录到从系统,从系统只判断用户名称,不需要考虑密码,如果该用户在从系统使用的sqlserver数据库中存在的话就让其以他该有的角色登录到系统,如果不存在则让该用户以游客的身份自动登录从系统,不知道这个单点做得标不标准,反...
  • Jthinking
  • Jthinking
  • 2006-10-27 08:12
  • 3093

单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密

我们在前一篇文章中实现了cas4.2.x登录使用mongodb验证方式。单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程也学习参考了cas5.0.x版本的mongodb的四种加密方式。单点登录(十四)-----实战-----cas5.0.x登录mongo...
  • q383965374
  • q383965374
  • 2017-02-13 20:35
  • 1958

sso单点登录,HTTP跳转HTTPS登录后回跳HTTP

之前在单点登录服务器里直接回跳登录以前的页面很正常,但是使用HTTPS协议的时候。当调用response.sendredirect(url)时会把HTTP协议自动转换为HTTPS协议。造成回跳不通过。因此需要一个中间页面,通过页面跳转,不使用服务器的跳转方法。 写一个跳转页面href.html。把...
  • yulio1234
  • yulio1234
  • 2017-08-22 17:57
  • 586

商城项目实战33:单点登录系统SSO实现

1. 计划 1、 实现单点登录系统 2、 实现用户的登录功能 3、 实现用户的注册功能 2. 单点登录系统分析 2.1. 什么是SSO SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可...
  • xxssyyyyssxx
  • xxssyyyyssxx
  • 2017-06-06 11:01
  • 1230

SPRING SESSION实现单点登录

概述 利用Spring session和redis数据库实现单点登录功能。介绍了Spring session 的使用,包括从jar 包的导入,redis 数据库的配置,spring session配置文件的编写,到最后单点登录功能的实现。
  • Moxies8090
  • Moxies8090
  • 2016-11-26 21:21
  • 7722
    个人资料
    • 访问:435925次
    • 积分:5515
    • 等级:
    • 排名:第5744名
    • 原创:157篇
    • 转载:103篇
    • 译文:1篇
    • 评论:45条
    最新评论