`
suene
  • 浏览: 35612 次
社区版块
存档分类
最新评论

Spring Security , authenticate use LDAP& DataBase.

    博客分类:
  • java
阅读更多
基础部分参见:
http://suene.iteye.com/blog/1829807


	<authentication-manager>
		<authentication-provider ref="authenticationProvider" />
	</authentication-manager>

	<beans:bean id="authenticationProvider" class="org.e.simple.authtication.LdapAndDbAuthenticationProvider">
		<beans:property name="authenticateByLdap" value="false" />
		<beans:property name="url" value="ldap://localhost:10389/dc=example,dc=com" /> 
		<beans:property name="userSearchBase" value="ou=Users" />
		<beans:property name="hash" value="{sha}" />
	</beans:bean>


/** 先根据属性 {@link #authenticateByLdap }, 是否使用 LDAP 验证 用户信息. 否则使用数据库查询验证用户.<br/>
 * 
 * 如果验证成功,则以数据库获取用户的权限. */
public class LdapAndDbAuthenticationProvider implements AuthenticationProvider
{

	private static final Logger logger = LoggerFactory.getLogger(LdapAndDbAuthenticationProvider.class);

	@Autowired
	private UserRepository userRepository;

	/** LDAP server */
	private DefaultSpringSecurityContextSource contextSource;

	/** LdapAuthenticator */
	private LdapAuthenticator authenticator;

	/** 是否使用 LDAP 验证用户. */
	private boolean authenticateByLdap;

	// ldap url
	private String url;

	// <user-dn-pattern/>
	private String userDnPattern;

	// <user-search-filter/>
	private String userSearchFilter = "(uid={0})";

	// <user-search-base/>
	private String userSearchBase = "";

	// <password-compare />
	// 是否验证密码.
	private boolean passwordCompar = true;

	// <password-attribute/>
	private String passwordAttribute = "userPassword";

	// password-compare : hash
	// default = plaintext
	// 参考 org.springframework.security.config.authentication.PasswordEncoderParser.ENCODER_CLASSES
	private String hash = "plaintext";

	// password-encoder : base64
	private boolean useBase64;

	// 获取对应的 pwEncoder
	private PasswordEncoder pwEncoder;

	@PostConstruct
	public void init() throws Exception
	{

		if (passwordCompar)
		{

			AbstractBeanDefinition def = (AbstractBeanDefinition) PasswordEncoderParser.createPasswordEncoderBeanDefinition(hash, useBase64);
			Object pwEncoderObj = def.getBeanClass().newInstance();

			if (pwEncoderObj instanceof BaseDigestPasswordEncoder)
			{
				((BaseDigestPasswordEncoder) pwEncoderObj).setEncodeHashAsBase64(useBase64);
			}

			if (pwEncoderObj instanceof PasswordEncoder)
			{
				this.pwEncoder = (PasswordEncoder) pwEncoderObj;
			}
		}

		if (authenticateByLdap)
		{
			contextSource = new DefaultSpringSecurityContextSource(url);
			contextSource.afterPropertiesSet();

			LdapUserSearch userSearch = new FilterBasedLdapUserSearch(this.userSearchBase, this.userSearchFilter, contextSource);

			String[] userDnPatternArray = new String[0];

			if (StringUtils.hasText(userDnPattern))
			{
				userDnPatternArray = new String[]
				{ userDnPattern };
			}

			if (passwordCompar)
			{
				authenticator = new PasswordComparisonAuthenticator(contextSource);
				((PasswordComparisonAuthenticator) authenticator).setPasswordAttributeName(passwordAttribute);
				((PasswordComparisonAuthenticator) authenticator).setPasswordEncoder((PasswordEncoder) pwEncoder);
				((PasswordComparisonAuthenticator) authenticator).setUserDnPatterns(userDnPatternArray);
				((PasswordComparisonAuthenticator) authenticator).setUserSearch(userSearch);

			} else
			{
				authenticator = new BindAuthenticator(contextSource);
				((BindAuthenticator) authenticator).setUserDnPatterns(userDnPatternArray);
				((BindAuthenticator) authenticator).setUserSearch(userSearch);
			}
		}
	}

	@Override
	public Authentication authenticate(Authentication authentication) throws AuthenticationException
	{
		final UsernamePasswordAuthenticationToken userToken = (UsernamePasswordAuthenticationToken) authentication;

		String username = userToken.getName();
		String password = (String) authentication.getCredentials();

		if (!StringUtils.hasLength(username))
		{
			throw new BadCredentialsException("Empty Username");
		}

		if (!StringUtils.hasLength(password))
		{
			throw new BadCredentialsException("Empty Password");
		}

		List<User> users = userRepository.findByUsername(username);

		if (CollectionUtils.isEmpty(users))
		{
			throw new BadCredentialsException("Bad credentials");
		}

		UserDetails user = users.get(0);

		if (authenticateByLdap)
		{
			doLdapAuthentication(userToken);
		} else
		{
			if (passwordCompar)
			{
				String encodePassword = pwEncoder.encodePassword(password, null);
				if (!encodePassword.equals(user.getPassword()))
				{
					throw new BadCredentialsException("Bad credentials");
				}
			}
		}

		return createSuccessfulAuthentication(userToken, user);
	}

	protected DirContextOperations doLdapAuthentication(UsernamePasswordAuthenticationToken authentication)
	{
		try
		{
			return authenticator.authenticate(authentication);
		} catch (Exception e)
		{
			logger.error(e.getMessage(), e);
			throw new BadCredentialsException("Bad credentials");
		}
	}

	@Override
	public boolean supports(Class<?> authentication)
	{
		return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
	}

	protected Authentication createSuccessfulAuthentication(UsernamePasswordAuthenticationToken authentication, UserDetails user)
	{
		Object password = authentication.getCredentials();

		UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(user, password, user.getAuthorities());
		result.setDetails(authentication.getDetails());

		return result;
	}

	// set method...

}
分享到:
评论

相关推荐

    spring-security实现自定义登录认证.rar

    Spring Security 是一个强大的安全框架,广泛用于Java Web应用的安全管理,包括身份验证、授权和访问控制。在Spring Boot中,Spring Security提供了开箱即用的功能,使得开发者可以快速地为应用添加安全特性。本资源...

    springsecurity原理流程图.pdf

    Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是安全领域中Spring生态系统的一部分。Spring Security旨在为Java应用程序提供一个全面的安全解决方案,尤其适用于企业级应用场景。它主要...

    Tomcat中间件监控配置&指标.doc

    -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=172.24.24.235 在Linux平台下,可以在startup.sh文件中添加以下配置参数: export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun....

    spring security 参考手册中文版

    LDAP - spring-security-ldap.jar 26 ACL - spring-security-acl.jar 26 CAS - spring-security-cas.jar 26 OpenID - spring-security-openid.jar 26 测试 - spring-security-test.jar 26 2.4.4检出来源 26 3. ...

    Spring Security 新手入门级maven实例

    **Spring Security新手入门级Maven实例详解** Spring Security是一个强大且高度可定制的身份验证和访问控制框架,用于Java和Java EE应用。它为应用程序提供了全面的安全解决方案,包括用户认证、授权以及安全配置。...

    详解spring security 配置多个AuthenticationProvider

    Spring Security 配置多个 AuthenticationProvider 详解 Spring Security 是一个功能强大且灵活的安全框架,提供了多种身份验证机制和访问控制机制。在实际开发中,我们经常需要配置多个身份验证提供程序...

    spring security 4 小例子带自定义过滤器

    Spring Security 是一个强大的安全框架,用于为Java应用提供安全控制,包括身份验证、授权和访问控制。在Spring Security 4中,我们可以通过自定义过滤器来扩展其功能,以满足特定的安全需求。在这个小例子中,我们...

    springboot+springsecurity入门

    SpringBoot和SpringSecurity是Java开发领域中两个非常重要的框架,它们在构建现代Web应用程序时起着关键作用。SpringBoot简化了Spring应用的初始搭建以及开发过程,而SpringSecurity则为应用提供了全面的安全管理...

    Spring Security 3多用户登录实现之九 基于持久化存储的自动登录

    Spring Security是Java领域中一个强大的安全框架,用于处理应用程序的安全性。在“Spring Security 3多用户登录实现之九 基于持久化存储的自动登录”这一主题中,我们将探讨如何利用Spring Security来实现多用户登录...

    Laravel开发-ldap-auth .zip

    在本文中,我们将深入探讨如何在Laravel框架中集成LDAP(轻量级目录访问协议)认证,以便利用企业级的身份验证系统。标题“Laravel开发-ldap-auth .zip”暗示了这个压缩包可能包含了实现这一功能的相关代码、配置...

    Security登录认证中部分代码.zip

    在Spring Security框架中,登录认证是核心功能之一,它确保只有经过验证的用户才能访问受保护的资源。本文将深入探讨Spring Security中的登录认证过程,包括其原理、配置以及自定义实现。 首先,Spring Security...

    Spring Security 基于数据库的权限管理配置

    Spring Security 是一个强大的Java安全框架,它为Web应用程序提供了全面的安全解决方案。在基于数据库的权限管理配置中,Spring Security 允许我们存储、管理和验证用户的访问权限,这使得权限控制更加灵活和可扩展...

    Spring Security通过AuthenticationManager的逻辑实现多种认证方式.docx

    在Spring Security框架中,`AuthenticationManager`扮演着至关重要的角色,它是...这种设计使得Spring Security能够轻松地支持多种认证机制,如数据库验证、LDAP验证、社交登录等,从而提高应用的安全性和可扩展性。

    利用spring security 给cxf的业务方法添加保护

    Spring Security是一个强大的、高度可定制的身份验证和授权框架,广泛应用于Java环境。本文将深入探讨如何利用Spring Security来保护Apache CXF服务中的业务方法,确保只有经过适当授权的用户才能访问。 Apache CXF...

    springsecurity2 自定义filter实现

    在Spring Security框架中,自定义过滤器是实现特定安全需求的一种常见方式。Spring Security的核心功能是通过一系列的Filter链来处理HTTP请求,这些Filter包括认证、授权等关键操作。本篇我们将深入探讨如何在Spring...

    基于springldap的增删改查以及验证

    在IT行业中,Spring LDAP是一个非常重要的框架,它为Spring应用提供了与LDAP(轻量级目录访问协议)服务器交互的能力。Spring LDAP使得开发人员能够利用Spring的IoC(控制反转)和AOP(面向切面编程)特性来处理LDAP...

    Spring 初步实现LDAP 域认证

    在本文中,我们将探讨如何使用Spring框架来实现LDAP(轻量级目录访问协议)域认证。这是一项重要的技术,特别是对于那些希望集中管理和验证多个应用系统账号密码的企业而言。通过集成Spring与LDAP,我们可以实现一个...

    spring security测试

    Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个"spring security测试"的主题中,我们将深入探讨如何对Spring Security进行单元测试,以确保我们的安全配置和逻辑正确无误。 ...

    解决java.lang.SecurityException: JCE cannot authenticate the provider BC问题

    在与银联的对接中,调试过程中报错或使用类似登入加密:java.lang.SecurityException: JCE cannot authenticate the provider BC 进行问题解决,里面包含 bcprov-jdk16-143.jar与bcprov-jdk15-135.jar与具体文件存放...

    SpringSecurity集成JWT

    SpringSecurity是Java领域中一款强大的安全框架,它提供了一套完整的解决方案来保护Spring应用程序。而JWT(Json Web Token)是一种轻量级的身份验证机制,广泛应用于API的安全授权。本篇文章将详细探讨如何将Spring...

Global site tag (gtag.js) - Google Analytics