`
peterwanghao
  • 浏览: 128529 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Apache Shiro进行身份认证-LDAP两次绑定认证

 
阅读更多
通常在根据LDAP进行身份验证时会采取以下三种方法:

1、利用一个LDAP用户的用户名和密码绑定到LDAP服务器。

2、在LDAP中检索一个用户的条目,然后将提供的密码和检索到的LDAP记录中的密码属性相比较。

3、“两次绑定”验证方法。

基于LDAP进行身份验证,最好也是最通用的方法就是 “两次绑定”。这种方法的步骤以及优点可参看我的另一篇博客:基于LDAP进行验证-方法和问题

当前Shiro只支持了第一种方法,即使用用户名和密码到LDAP服务器中进行绑定来判断合法性。

我自己写了一个认证类,实现了“两次绑定”验证。同时解决了目前做LDAP认证时没有区分错误情况,返回的错误提示信息不够准确的问题。

配置信息:

[main]
ldapRealm = main.java.name.peter.shiro.realm.ldap.LdapAuthenticator
ldapRealm.rootDN = dc=example,dc=com
ldapRealm.contextFactory.url = ldap://localhost:389
ldapRealm.contextFactory.systemUsername = cn=Manager,dc=example,dc=com
ldapRealm.contextFactory.systemPassword = secret

认证类:

/***
 * 基于Ldap进行身份认证,二次绑定方式.
 * 
 * @author wanghao
 * 
 */
public class LdapAuthenticator extends JndiLdapRealm {

	private static final Logger log = LoggerFactory
			.getLogger(LdapAuthenticator.class);
	private String rootDN;

	public LdapAuthenticator() {
		super();
	}

	public String getRootDN() {
		return rootDN;
	}

	public void setRootDN(String rootDN) {
		this.rootDN = rootDN;
	}

	@Override
	/***
	 * 认证
	 */
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		AuthenticationInfo info;
		try {
			info = queryForAuthenticationInfo(token, getContextFactory());
		} catch (AuthenticationNotSupportedException e) {
			String msg = "Unsupported configured authentication mechanism";
			throw new UnsupportedAuthenticationMechanismException(msg, e);
		} catch (javax.naming.AuthenticationException e) {
			String msg = "LDAP authentication failed.";
			throw new AuthenticationException(msg, e);
		} catch (NamingException e) {
			String msg = "LDAP naming error while attempting to authenticate user.";
			throw new AuthenticationException(msg, e);
		} catch (UnknownAccountException e) {
			String msg = "UnknownAccountException";
			throw new UnknownAccountException(msg, e);
		} catch (IncorrectCredentialsException e) {
			String msg = "IncorrectCredentialsException";
			throw new IncorrectCredentialsException(msg, e);
		}

		return info;
	}
	
	@Override
	protected AuthenticationInfo queryForAuthenticationInfo(
			AuthenticationToken token, LdapContextFactory ldapContextFactory)
			throws NamingException {

		Object principal = token.getPrincipal();
		Object credentials = token.getCredentials();

		LdapContext systemCtx = null;
		LdapContext ctx = null;
		try {
			systemCtx = ldapContextFactory.getSystemLdapContext();

			SearchControls constraints = new SearchControls();
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
			NamingEnumeration results = systemCtx.search(rootDN, "cn="
					+ principal, constraints);
			if (results != null && !results.hasMore()) {
				throw new UnknownAccountException();
			} else {
				while (results.hasMore()) {
					SearchResult si = (SearchResult) results.next();
					principal = si.getName() + "," + rootDN;
				}
				log.info("DN="+principal);
				try {
					ctx = ldapContextFactory.getLdapContext(principal,
							credentials);
				} catch (NamingException e) {
					throw new IncorrectCredentialsException();
				}
				return createAuthenticationInfo(token, principal, credentials,
						ctx);
			}
		} finally {
			LdapUtils.closeContext(systemCtx);
			LdapUtils.closeContext(ctx);
		}
	}
}



分享到:
评论

相关推荐

    shiro_attack_2.2.zip

    3. 如果验证成功,Shiro创建一个Subject对象并绑定已认证的用户身份。 **Shiro的授权机制** Shiro使用角色(Role)和权限(Permission)进行授权。角色是权限的集合,用户可以拥有一个或多个角色,每个角色包含一组...

    apache shiro使用

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。Shiro 不仅可以用于 Java Web 应用,也可以用于 Java SE(Java 桌面应用)环境。在本...

    shiro源码代码

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供认证、授权、加密和会话管理功能,可简化开发安全应用程序的工作。在本文中,我们将深入探讨 Shiro 的核心概念、架构以及如何与 Spring 框架集成。 1. **Shiro...

    Maven工程 SSM 整合Shiro

    1. **身份认证**:用户提交登录请求后,Shiro会通过 Realm 进行身份验证,通常涉及从数据库中查找用户和密码匹配的过程。如果验证成功,Shiro会创建一个Subject并将其绑定到当前线程,以便后续操作可以获取用户信息...

    [免费]Shiro登录简单实例源码

    Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能,可以简化企业级应用的安全实现。本资源提供的 "[免费]Shiro登录简单实例源码" 是一个非常适合初学者理解Shiro核心功能的示例...

    shiro

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密以及会话管理功能,简化了企业级应用的安全实施。它以其简洁的 API 和灵活的设计深受开发者喜爱。在深入理解 Shiro 的核心概念之前,我们...

    shiro demo

    在这个"shiro demo"中,我们将会探讨如何在Java项目中集成Shiro框架,并利用Oracle数据库进行用户身份验证和授权。 首先,Shiro的核心组件包括Subject、Realms、Cryptography(加密)和Session Management(会话...

    Shiro 安全资料

    当Subject进行身份验证时,Shiro会询问Realm来确认其身份;在进行权限检查时,也会向Realm查询Subject的权限信息。 3. **Cryptography** - 加密是Shiro提供的重要功能,它包括密码学的各个方面,如哈希、加密、消息...

    shiro学习笔记0.0.0.0

    3. **Realm**: 它是 Shiro 和应用安全数据源(如数据库、LDAP 等)的桥梁,负责获取用户的身份验证和授权信息。 **四、Shiro 的应用场景** 1. Web 应用:Shiro 可以很好地集成到 SpringMVC 或 Struts2 等 Web 框架...

    shiro验证demo

    在"shiro验证demo"中,我们将探讨如何使用Shiro来实现用户身份验证和权限控制。 **Shiro的基本组件** 1. **认证(Authentication)**:确认用户身份的过程,即用户提供的身份凭证是否有效。在Shiro中,通常涉及...

    shiro_study

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、会话管理和加密等核心功能。这个 "shiro_study" 压缩包包含两个部分,"shiro_study1" 和 "shiro_study2",分别展示了在纯 Java 环境和基于 ...

    shiro第六章Realm完整Demo

    Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证、授权、会话管理和加密等功能。在本"shiro第六章Realm完整Demo"中,我们将深入理解Shiro的核心组件——Realm,以及如何通过 Realm 实现用户认证...

    shiro相关jar

    - **示例说明**:本文档将通过具体的示例展示如何使用Shiro进行认证与授权,包括如何定义角色(Role)和权限(Permission),并演示Shiro与Grails框架的集成。 #### 八、总结 Shiro作为一款新兴的安全框架,凭借其强大...

    基于Java的两个通用安全模块的设计与实现.zip

    JAAS提供了可扩展的模型,允许开发者添加自定义的身份验证模块,例如,支持LDAP、Active Directory或者数据库验证。此外,Spring Security是另一个流行的Java安全框架,它提供了丰富的身份验证和授权功能,包括支持...

    shiro_demo:四郎学习演示

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可以非常容易地开发出足够安全的应用。在这个名为 "shiro_demo" 的项目中,开发者 "tuofan" 在2018年5月22日创建了一个学习...

    shiro.zip

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、会话管理和加密等核心功能。在 Spring Boot 应用中,Shiro 能够与 Spring 框架无缝集成,为微服务架构提供安全支持。下面我们将深入探讨 Shiro...

    ShiroHello源代码.rar

    Apache Shiro是一个轻量级的安全框架,它提供了一种直观且易于理解的API,使得开发者可以轻松地处理身份验证(登录)、授权(权限控制)、会话管理(session)和加密等功能。在Shiro中,主要有三个核心概念:Subject...

Global site tag (gtag.js) - Google Analytics