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

自定义单点登录项目 (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;
	}
}


分享到:
评论

相关推荐

    Jeecg配置单点登录 登录验证完整代码

    在本场景中,我们关注的是Jeecg如何配置单点登录(Single Sign-On,简称SSO)以及相关的登录验证代码。单点登录是一种网络应用架构中的安全机制,允许用户在一次登录后,就能访问多个相互关联的应用系统,而无需再次...

    U8+ 门户集成 单点登录

    U8+门户集成单点登录不仅能够简化用户登录流程,还能够集成自定义开发的应用程序或组件,包括使用VB6或C#等语言开发的界面。这为企业提供了极大的灵活性,可以根据自身需求定制开发特定的功能模块,并将其无缝集成到...

    基于Cas的单点登录实现

    1. **单点登录**:用户只需登录一次,即可访问所有支持CAS的系统。 2. **票证验证**:通过票证(Ticket)机制,确保用户身份的安全传输。 3. **多协议支持**:支持多种协议,如CAS、SAML、OAuth等。 4. **可扩展性**...

    TIA博途Wincc中如何自定义登录界面?.docx

    自定义登录界面的第一步是在HMI设备项目树的“用户管理”部分添加新的用户。例如,我们可以创建一个名为“User_1”的用户,并为其设置相应的密码。这是确保系统安全性的基本步骤,每个用户都应该有独立的用户名和...

    shiro实现单点登录

    在IT行业中,单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户在一个应用系统中登录后,无需再次认证即可访问其他相互信任的应用系统。Apache Shiro是一个强大且易用的Java安全框架,提供了认证...

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录...通过学习和实践,你可以掌握CAS的核心概念,实现自定义认证策略,以及优化客户端集成,从而为你的项目构建一个强大而安全的单点登录系统。

    单点登录1

    单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。在本文中,我们将深入探讨单点登录的基本原理、实现方式以及其在实际应用中的价值...

    单点登录代码整理

    在这个"单点登录代码整理"的主题中,我们主要探讨的是如何实现SSO系统,尤其是通过开源项目CAS(Central Authentication Service)进行的客户端集成。 CAS是一个开放源码的身份验证框架,它提供了SSO服务,允许用户...

    java 单点登录.docx

    ### Java单点登录(SSO)技术详解 #### 一、单点登录(SSO)概述 单点登录(Single Sign-On,简称SSO)是一种让用户只需一次登录就能访问多个应用程序的技术。这种技术对于提高用户体验和安全性非常有用。在企业级应用...

    .net版本单点登录与权限管理(web api)

    在.NET框架中,单点登录(Single Sign-On, SSO)和权限管理是构建安全、高效Web应用程序的关键组件。Web API作为一个轻量级的HTTP服务框架,常用于构建RESTful API,它同样需要处理身份验证和授权问题。下面将详细...

    springboot+redis+shiro单点登录,统一异常处理,统一日志

    总结起来,这个项目将SpringBoot的便捷性与Shiro的安全控制和Redis的高速缓存相结合,实现了高效的SSO单点登录,同时提供了统一的异常处理和日志管理机制,提高了系统的稳定性和用户体验。这是一套完整的解决方案,...

    单点登录的简单实现 在门户项目中

    总的来说,单点登录的实现取决于项目的需求、预算和技术背景。无论是采用成熟的商业软件,还是自定义开发,关键是确保安全、高效地提供用户认证,同时简化后台管理。对于开发者而言,理解SSO的工作原理,选择合适的...

    cas .net单点登录

    本示例将详细介绍如何在.NET项目中集成CAS单点登录。 首先,我们需要理解单点登录的概念。单点登录允许用户在一个系统中登录后,可以无须再次认证即可访问其他相互信任的系统,提高了用户体验和安全性。CAS作为一个...

    php实现单点登录实例

    在IT行业中,单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户在一个系统上登录后,无需再次输入凭证就能访问多个相互信任的系统。这对于大型网络环境或拥有多个子系统的公司来说尤其有用,可以...

    模拟OAuth2 单点登录

    单点登录(Single Sign-On, SSO)则是一种让用户在多个应用系统中只需要登录一次就能访问所有系统的机制。当你提到“模拟OAuth2 单点登录的java代码实现”时,我们可以探讨以下几个关键知识点: 1. **OAuth2 授权...

    入门级单点登录源码

    单点登录(Single Sign-On,简称SSO)是一种网络应用中的身份验证机制,它允许用户在一次登录后,就可以访问多个相互信任的应用系统,而无需再次进行身份验证。CAS(Central Authentication Service)是 Yale 大学...

    sso单点登录源代码

    SSO(Single Sign-On)单点登录是一种网络认证机制,允许用户在一次登录后,就能访问多个相互关联的应用系统,而无需再次输入凭证。这种技术极大地提升了用户体验,减少了记忆和输入多个用户名和密码的麻烦,同时也...

    spring boot 集成kisso单点登入

    Kisso,作为一个轻量级的单点登录解决方案,相比CAS(Central Authentication Service)更为简洁,适用于小型项目或快速开发场景。下面我们将深入探讨如何在Spring Boot项目中实现Kisso的集成,以及相关的技术要点。...

    ssm redis实现sso单点登录

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次进行身份验证。在本文中,我们将深入探讨如何使用SSM(Spring MVC、Spring、MyBatis)框架结合Redis...

    TIA博途WINCC中如何自定义登录对话框(下拉列表方式)?.docx

    7. **设置默认启动对话框**:为了让项目启动时显示自定义登录对话框,需要在“项目属性”中设置启动画面为这个自定义登录对话框。 8. **测试与调试**:最后,保存并编译项目,进行模拟运行以测试登录功能。确保所有...

Global site tag (gtag.js) - Google Analytics