一. 什么是 JAAS ?
JAAS ( Java Authentication and Authorization Service )是一个在 java 中验证用户和给用户授权的可移植性接口。
开发者可以通过两种不同应用场景使用到 JAAS :
1. java 单独连接到远程 EJB 系统时
2. 当客户通过 WEB 浏览器连接到 Servlet 或 jsp 时, WEB 浏览器用户需要提供凭证给 Servlet 或 jsp 层。随后, Servlet 或 jsp 层能够借助 JAAS 完成用户的认证操作。
为系统增加安全性时,客户端需要通过两个安全措施:
1. 首先,客户端必须通过验证。验证过程合适客户身份。一旦通过验证,在接下来的
会话过程中,这个用户就与一个安全身份相联系。
2. 客户端必须经过授权。客户一旦通过验证,它还必须具有执行相应操作的权限。
二 . 在 WEB 应用中应用 JAAS(以JBOSS服务器环境为例)
WEB 浏览器可以使用多种方法提供身份证明,例如:基本验证,基于表单的验证,摘要验证,正数验证等。这里介绍的是基本验证,即 WEB 客户端想服务器提供一个用户名和密码,这个服务器通过检查存储在永久性数据库中的用户名和密码来验证这些证明身份的信息。
1. 在 WEB 应用中的 web.xml 中声明角色,例如:
<security-role>
<role-name>manager</role-name>
</security-role>
<security-role>
<role-name>user</role-name>
</security-role>
2. 为以声明的角色邦定资源,例如, manager 可以访问/ WEB-ROOT/manager 目录下的资源,而 manager 和 user 都可以访问 /WEB-ROOT/public 目录下的资源:
<security-constraint>
<web-resource-collection>
<web-resource-name>publicResource</web-resource-name>
<url-pattern>/public/*</url-pattern>
<http-method>POST</http-method>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>mamager</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>managerResource</web-resource-name>
<url-pattern>/manage/*</url-pattern>
<http-method>POST</http-method>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
3 .为了收集 WEB 客户端的登录信息,需要在 web.xml 中配置信息输入框,例如:
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
这样就会由浏览器自动弹出登录对话框。
4. 定制用户信息。
A. 如果用户很少,可以将用户信息保存在属性文件中:
users.properties 文件内容:
guest=password
admin=password
Roles.properties 文件内容:
guest=user
admin=manager
注意:两个文件的名字是固定的。
B. 如果用户很多,就需要将用户信息保存到数据库中:
在 %JBOSS_HOME%/server/default/conf/login-config.xml 文件中添加域:
<application-policy name = "mydomain">
<authentication>
<login-module code =
"org.jboss.security.auth.spi.DatabaseServerLoginModule"
flag = "required">
<module-option name =
"unauthenticatedIdentity">guest</module-option>
<module-option name =
"dsJndiName">java:/MySqlDS</module-option>
<module-option name = "principalsQuery">SELECT PASSWD FROM
USERS WHERE USERID=?</module-option>
<module-option name = "rolesQuery">SELECT ROLEID, 'Roles' FROM
ROLES WHERE USERID=?</module-option>
</login-module>
</authentication>
</application-policy>
注意:其中的数据源名字,表名以及字段名根据情况配置。当然这些表是需要事先建好的。
5. 如果 4 中使用的是 B 方法,则还需要添加配置文件来通知服务器要使用自定义的域。
在 WEB-INF 目录下添加 jboss-web.xml 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.4//EN" "jboss-web_4_0.dtd" >
<jboss-web>
<security-domain>java:jaas/mydomain</security-domain>
</jboss-web>
这里的 mydomain 就是第四步中添加的域。
三 . 在桌面客户端中应用 JAAS
1 服务器端:
对于非 WEB 项目,所谓的资源就是方法,因此授权与认证也是针对方法来说。
对类使用 @DeclareRoles 标注来声明角色,如:
@DeclareRoles({"leader","member"}) 声明了两个角色
对方法授权,使用 @RolesAllowed ,例如:
@RolesAllowed({"leader"}) 使 lerder 角色对某个方法具有操作权限
如果某个方法对所有角色都是开放的,可以使用 @PermitAll 标注。
注意:由于服务是由服务器提供实现的,例如 jboss ,所以要对一个类使用
认证与授权服务,必须让服务器的容器来管理它们,应该用 @Stateless
来标注。
2 客户端
在 WEB 环境中,因为有
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
这样的配置,浏览器会自动弹出登录对话框,从而来收集客户端的登录信息。那么
在普通的客户端程序用该如何向服务端发送登录信息呢?
可以使用 SecurityAssociation 的连个静态方法:
SecurityAssociation.setPrincipal(new SimplePrincipal("hr")) :设置登录用户名
SecurityAssociation.setCredential("hr") :设置登录密码
3 认证信息的配置与 WEB 项目中一样(这些是与具体服务器相关的,而非项目)
四.关于可移植性
授权配置是可移植的,因为它是标准 WEB 项目的一部分(在 web.xml 文件中配置)
也就是说,一个项目从一个服务器(例如 JBOSS )转移到另一个服务器(例如 Weblogic )
中时,授权配置不用做任何更改。
认证信息就不可以了。认证信息是与服务器相关的,各种服务器的认证信息配置
是不一样的。但是,这些配置都是大同小异。因此,项目移植时,只需要根据服务器
使用文档来修改相关配置即可。