JAAS的核心类和接口可以被分为三种类型,大多数都在javax.security.auth包中。在J2SE 1.4中,还有一些接口的实现类在com.sun.security.auth包中,如下所示:
1、 普通类 Subject,Principal,Credential(凭证)
Subject类代表了一个验证实体,它可以是用户、管理员、Web服务,设备或者其他的过程。该类包含了三中类型的安全信息:
1) 身份(Identities):由一个或多个Principal对象表示
2) 公共凭证(Public credentials):例如名称或公共密钥
3) 私有凭证(Private credentials):例如口令或私有密钥
Principal对象代表了Subject对象的身份。它们实现了java.security.Principal和java.io.Serializable接口。在Principal类中,最重要的方法是getName()。该方法返回一个身份名称。在Subject对象中包含了多个Principal对象,因此它可以拥有多个名称。由于登录名称、身份证号和Email地址都可以作为用户的身份标识,可见拥有多个身份名称的情况在实际应用中是非常普遍的情况。
在上面提到的凭证并不是一个特定的类或借口,它可以是任何对象。凭证中可以包含任何特定安全系统需要的验证信息,例如标签(ticket),密钥或口令。Subject对象中维护着一组特定的私有和公有的凭证,这些凭证可以通过Subject 方法getPrivateCredentials()和getPublicCredentials()获得。这些方法通常在应用程序层中的安全子系统被调用。
2、 验证 LoginContext,LoginModule,CallBackHandler,Callback
验证:LoginContext
在应用程序层中,你可以使用LoginContext对象来验证Subject对象。LoginContext对象同时体现了JAAS的动态可插入性(Dynamic Pluggability),因为当你创建一个LoginContext的实例时,你需要指定一个配置。LoginContext通常从一个文本文件中加载配置信息,这些配置信息告诉LoginContext对象在登录时使用哪一个LoginModule对象。
下面列出了在LoginContext中经常使用的三个方法:
《1》 login () 进行登录操作。该方法激活了配置中制定的所有LoginModule对 象。如果成功,它将创建一个经过了验证的Subject对象;否则抛出LoginException异常。
《2》 getSubject () 返回经过验证的Subject对象
《3》 logout () 注销Subject对象,删除与之相关的Principal对象和凭证
验证:LoginModule
LoginModule是调用特定验证机制的接口。J2EE 1.4中包含了下面几种LoginModule的实现类:
《1》 JndiLoginModule 用于验证在JNDI中配置的目录服务
《2》 Krb5LoginModule 使用Kerberos协议进行验证
《3》 NTLoginModul 使用当前用户在NT中的用户信息进行验证
《4》 UnixLoginModule 使用当前用户在Unix中的用户信息进行验证
同上面这些模块绑定在一起的还有对应的Principal接口的实现类,例如NTDomainPrincipal和UnixPrincipal。这些类在com.sun.security.auth包中。
LoginModule接口中包含了五个方法:
1) initialize () 当创建一LoginModule实例时会被构造函数调用
2) login () 进行验证,通常会按照登录条件生成若干个Principal对象
3) commit () 进行Principal对象检验,按照预定义Principal条件检验Login生成的Principal对象,所有需要的条件均符合后,把若干个生成的Principal对象付给Subject对象,JAAS架构负责回传给LoginContext.
4) abort () 当任何一个LoginModule对象验证失败时都会调用该方法。任何已经和Subject对象绑定的Principal对象都会被解除绑定。
5) logout () 删除与Subject对象关联的Principal对象和凭证,消除Subject,Principal等认证对象。
验证:CallbackHandler和Callback
CallbackHandler和Callback对象可以使LoginModule对象从系统和用户那里收集必要的验证信息,同时独立于实际的收集信息时发生的交互过程。
JAAS在javax.sevurity.auth.callback包中包含了七个Callback的实现类和两个CallbackHandler的实现类:ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只会在客户端会被使用到。我将在后面介绍如何编写你自己的CallbackHandler类。
3、 授权 Policy,AuthPermission,PrivateCredentialPermission
package com.sss;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
public class SimpleLogin
{
public static void main(String[] args)
{
// 建立登陆上下文,并通过配置文件初始化,在这里配置文件必须与程序同目录
LoginContext loginContext = null;
try
{
//设置JAAS配置文件
System.setProperty("java.security.auth.login.config", "D:\\install\\eclipse\\workspace\\springtest\\jaas.config");
loginContext = new LoginContext("simple",new SimpleCallbackHandle());
}
catch (LoginException e)
{
System.out.println(e.getMessage());
}
try
{
// 如果不抛出异常表示验证成功
loginContext.login();
Subject subject =loginContext.getSubject();
// subject.d
Subject.doAs(subject, new MyPrivilege());
}
catch (LoginException e)
{
}
}
}
package com.sss;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
public class SimpleCallbackHandle implements CallbackHandler
{
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException
{
for (Callback callback : callbacks)
{
if (callback instanceof NameCallback)
{
NameCallback nc = (NameCallback) callback;
System.out.print(nc.getPrompt()+"1111");
System.out.flush();
nc.setName("dibin");
// nc.setName((new BufferedReader(new InputStreamReader(
// System.in))).readLine());
}
else if (callback instanceof PasswordCallback)
{
PasswordCallback pcb = (PasswordCallback) callback;
System.out.print(pcb.getPrompt());
System.out.flush();
pcb.setPassword(new char[]{'d','i','b','i','n'});
// pcb.setPassword((new BufferedReader(new InputStreamReader(
// System.in))).readLine().toCharArray());
}
}
}
}
package com.sss;
import java.io.IOException;
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
public class SimpleLoginModule implements LoginModule
{
private String userName;
private char[] password;
private Subject subject;
private CallbackHandler callbackHandler;
private Map sharedState;
private Map options;
private String debug;
public boolean abort() throws LoginException
{
System.out.println("abort()");
return false;
}
public boolean commit() throws LoginException
{
System.out.println("commit()");
return true;
}
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
debug = (String) options.get("debug");
}
public boolean login() throws LoginException
{
System.out.println("**********************");
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("用户名: ");
callbacks[1] = new PasswordCallback("密码: ", false);
try
{
callbackHandler.handle(callbacks);
userName = ((NameCallback) callbacks[0]).getName();
password = ((PasswordCallback) callbacks[1]).getPassword();
if (debug.equals("true"))
{
System.out.println("你输入的用户名为:" + userName);
System.out.println("你输入的密码为:" + new String(password));
}
if (userName.equals("dibin")
&& new String(password).equals("dibin"))
{
System.out.println("验证成功");
return true;
}
else
{
System.out.println("验证失败");
userName = null;
password = null;
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch (UnsupportedCallbackException e)
{
e.printStackTrace();
}
return false;
}
public boolean logout() throws LoginException
{
System.out.println("logout()");
return false;
}
}
simple {
com.sss.SimpleLoginModule required debug=true;
};
package com.sss;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
public class MyPrivilege implements PrivilegedAction{
public Object run() {
// TODO Auto-generated method stub
System.out.println("this is run method");
return null;
}
}
分享到:
相关推荐
- **可插拔的身份验证机制**:JAAS支持多种身份验证方法,并允许开发者根据实际需求选择或自定义身份验证模块。 - **统一的API**:无论底层采用何种技术实现,JAAS都提供了一致的编程接口(SPI),便于应用程序调用...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于实现用户身份验证和权限管理的核心组件。这个"Java JAAS安全认证 demo"是一个示例项目,旨在帮助开发者理解如何在Java应用中实施安全认证...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全验证和权限管理的重要框架。它为应用程序提供了一种标准化的方式来处理用户身份验证和权限分配,从而确保只有经过验证的用户才能访问受...
- 登录配置文件(如`demo.conf`)的正确设置至关重要,它决定了应用程序如何选择和配置LoginModule,从而影响整个身份验证流程。 - CallbackHandler的实现应考虑用户体验,确保在收集用户信息时遵循最佳实践,如使用...
这份材料似乎是一份教学幻灯片的摘要,重点介绍了JAAS的基本概念、登录上下文(LoginContext)、回调处理器(CallbackHandler)、以及登录模块(LoginModule)等内容。 ### JAAS简介 JAAS是Java平台提供的一个认证...
在这个演示中,我们将深入探讨如何利用JAAS进行用户登录验证,并设置相应的访问控制。 首先,JAAS的核心概念包括认证(Authentication)和授权(Authorization)。认证是确认用户身份的过程,而授权则决定了认证后...
JSF可以结合Servlet容器的安全特性,如JAAS(Java Authentication and Authorization Service),来实现用户认证和授权。 8. **集成其他技术**:JSF项目通常会与数据库(如JPA或Hibernate)、REST服务、第三方支付...
- **认证与授权**:登录验证、权限控制等,通常通过自定义过滤器或使用标准的如JAAS(Java Authentication and Authorization Service)来实现。 - **防止SQL注入**和**XSS攻击**:了解并应用编码规范和安全库,...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于实现身份验证和授权的安全框架。它在Java安全架构中扮演着重要角色,确保程序在运行时能够保护系统免受恶意攻击,并且只允许授权的用户或...
Keycloak BearerTokenLoginModule JAAS适配器(jaas_realm = console)将承载令牌转换为Artemis角色,以供管理XML中定义的控制台RBAC使用。 直接使用JMS客户端凭据进行身份验证的代理(client_id = artemis-broker...
6. **安全性**:ActiveMQ的安全机制是通过用户认证和授权来实现的,它可以集成多种身份验证机制,如Jaas、LDAP等,并通过ACL(Access Control List)控制用户对资源的访问权限。 7. **示例与文档**:资料包中的...
而`activation.jar`(或在某些情况下称为`jaas.jar`)是JavaBeans Activation Framework的实现,它为处理未知MIME类型的数据提供了一种标准方式。这两个JAR文件一起使用,可以支持复杂的邮件操作,如添加附件、设置...
#### 八、演示(Demo) - **主要内容**:PPT 中提到会有简短的演示环节,通过具体的例子展示 JSecurity 的主要特性和使用方法。 #### 九、问答环节(Q&A) - **互动交流**:在演示结束后,将有时间留给参与者提问和...