通常在根据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);
}
}
}
分享到:
相关推荐
3. 如果验证成功,Shiro创建一个Subject对象并绑定已认证的用户身份。 **Shiro的授权机制** Shiro使用角色(Role)和权限(Permission)进行授权。角色是权限的集合,用户可以拥有一个或多个角色,每个角色包含一组...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。Shiro 不仅可以用于 Java Web 应用,也可以用于 Java SE(Java 桌面应用)环境。在本...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供认证、授权、加密和会话管理功能,可简化开发安全应用程序的工作。在本文中,我们将深入探讨 Shiro 的核心概念、架构以及如何与 Spring 框架集成。 1. **Shiro...
1. **身份认证**:用户提交登录请求后,Shiro会通过 Realm 进行身份验证,通常涉及从数据库中查找用户和密码匹配的过程。如果验证成功,Shiro会创建一个Subject并将其绑定到当前线程,以便后续操作可以获取用户信息...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能,可以简化企业级应用的安全实现。本资源提供的 "[免费]Shiro登录简单实例源码" 是一个非常适合初学者理解Shiro核心功能的示例...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密以及会话管理功能,简化了企业级应用的安全实施。它以其简洁的 API 和灵活的设计深受开发者喜爱。在深入理解 Shiro 的核心概念之前,我们...
在这个"shiro demo"中,我们将会探讨如何在Java项目中集成Shiro框架,并利用Oracle数据库进行用户身份验证和授权。 首先,Shiro的核心组件包括Subject、Realms、Cryptography(加密)和Session Management(会话...
当Subject进行身份验证时,Shiro会询问Realm来确认其身份;在进行权限检查时,也会向Realm查询Subject的权限信息。 3. **Cryptography** - 加密是Shiro提供的重要功能,它包括密码学的各个方面,如哈希、加密、消息...
3. **Realm**: 它是 Shiro 和应用安全数据源(如数据库、LDAP 等)的桥梁,负责获取用户的身份验证和授权信息。 **四、Shiro 的应用场景** 1. Web 应用:Shiro 可以很好地集成到 SpringMVC 或 Struts2 等 Web 框架...
在"shiro验证demo"中,我们将探讨如何使用Shiro来实现用户身份验证和权限控制。 **Shiro的基本组件** 1. **认证(Authentication)**:确认用户身份的过程,即用户提供的身份凭证是否有效。在Shiro中,通常涉及...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、会话管理和加密等核心功能。这个 "shiro_study" 压缩包包含两个部分,"shiro_study1" 和 "shiro_study2",分别展示了在纯 Java 环境和基于 ...
Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证、授权、会话管理和加密等功能。在本"shiro第六章Realm完整Demo"中,我们将深入理解Shiro的核心组件——Realm,以及如何通过 Realm 实现用户认证...
- **示例说明**:本文档将通过具体的示例展示如何使用Shiro进行认证与授权,包括如何定义角色(Role)和权限(Permission),并演示Shiro与Grails框架的集成。 #### 八、总结 Shiro作为一款新兴的安全框架,凭借其强大...
JAAS提供了可扩展的模型,允许开发者添加自定义的身份验证模块,例如,支持LDAP、Active Directory或者数据库验证。此外,Spring Security是另一个流行的Java安全框架,它提供了丰富的身份验证和授权功能,包括支持...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可以非常容易地开发出足够安全的应用。在这个名为 "shiro_demo" 的项目中,开发者 "tuofan" 在2018年5月22日创建了一个学习...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、会话管理和加密等核心功能。在 Spring Boot 应用中,Shiro 能够与 Spring 框架无缝集成,为微服务架构提供安全支持。下面我们将深入探讨 Shiro...
Apache Shiro是一个轻量级的安全框架,它提供了一种直观且易于理解的API,使得开发者可以轻松地处理身份验证(登录)、授权(权限控制)、会话管理(session)和加密等功能。在Shiro中,主要有三个核心概念:Subject...