您的位置:首页 > 编程语言 > Java开发

JAAS:java授权与认证服务

2011-01-22 13:18 393 查看
一.

什么是
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


中时,授权配置不用做任何更改。

认证信息就不可以了。认证信息是与服务器相关的,各种服务器的认证信息配置

是不一样的。但是,这些配置都是大同小异。因此,项目移植时,只需要根据服务器

使用文档来修改相关配置即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐