Posted on 2006-07-28 19:19
Earth 阅读(204)
评论(0) 编辑 收藏 所属分类:
JavaEE5/EJB3
The password files 密码文件
在任何的安全配置中,首先你得告诉应用程序在哪里可以找到用户名和密码以及角色。你可以使用LDAP服务器和数据库服务器来存储这类的信息。最简单的情况是在应用的classpath中使用简单的文本文件。下面是一个user.properties文件,它存储的是用户和密码对。在这个例子中有两个账号分别为admin和user.
admin=jboss
user=ejb3
下面是一个roles.properties文件。它存储了用户和角色之间的关系。每一个用户都可以拥有多个角色。比如用户admin就同时拥有AdminUser和RegularUser两种角色。
admin=AdminUser,RegularUser
user=RegularUser
The sample application 示例程序
作为一个例子,让我们试着做一个有密码保护功能的投资计算器程序。为了使用这个计算器,你需要用user或者admin的身份登陆。我建议你此时还是使用user登陆(密码是ejb3)
RegularUser可以使用计算器,只有AdminUser有权增加更多的funds和investor profiles。所以,如果使用user登陆并尝试运行下面的两个程序,你将遭遇安全异常。然后你可以试着以admin的身份再尝试一遍(密码是jboss)
Security annotations 安全标注
在EJB 3.0中, 你可以使用安全标注来指定在哪里可以找到密码/角色的列表,并且还可以指定哪种角色的用户允许访问这个方法。在下面的例子中,@SecurityDomain("other")表示在当前classpath下的.properties文件 是用来认证(authentication)的。@RolesAllowed表示哪些角色可以访问这种方法。用@PermitAll标注的方法则不受安全约束。
@Stateless
@SecurityDomain(
"
other
"
)
public
class
SecureCalculator
implements
Calculator {
@RolesAllowed({
"
AdminUser
"
})
public
void
addFund (String name,
double
growthrate) {
//
}
@RolesAllowed({
"
AdminUser
"
})
public
void
addInvestor (String name,
int
start,
int
end) {
//
}
@PermitAll
public
Collection
<
Fund
>
getFunds () {
//
}
//
@RolesAllowed({
"
RegularUser
"
})
public
double
calculate (
int
fundId,
int
investorId,
double
saving) {
//
}
}
The web layer configuration web层的配置
如果你是通过web页面登陆到系统,你的身份则会被应用的web层捕获,然后传递到EJB 3.0的中间层。你不得不配置web.xml文件来声明哪些页面受密码保护以及这些页面允许哪些角色访问。下面就是web.xml文件的内容。
<
web-app
>
<
display-name
>
EJB3Trail
</
display-name
>
<
security-constraint
>
<
web-resource-collection
>
<
web-resource-name
>
The Protected Calculator
</
web-resource-name
>
<
url-pattern
>
services/security/addfund.jsp
</
url-pattern
>
<
url-pattern
>
services/security/addinvestor.jsp
</
url-pattern
>
<
url-pattern
>
services/security/calculator.jsp
</
url-pattern
>
</
web-resource-collection
>
<
auth-constraint
>
<
role-name
>
AdminUser
</
role-name
>
<
role-name
>
RegularUser
</
role-name
>
</
auth-constraint
>
<
user-data-constraint
>
<
transport-guarantee
>
NONE
</
transport-guarantee
>
</
user-data-constraint
>
</
security-constraint
>
<
security-role
>
<
description
>
Authorized to access everything.
</
description
>
<
role-name
>
AdminUser
</
role-name
>
</
security-role
>
<
security-role
>
<
description
>
Authorized to limited access.
</
description
>
<
role-name
>
RegularUser
</
role-name
>
</
security-role
>
<
login-config
>
<
auth-method
>
FORM
</
auth-method
>
<
form-login-config
>
<
form-login-page
>
security/login.html
</
form-login-page
>
<
form-error-page
>
security/loginFailed.html
</
form-error-page
>
</
form-login-config
>
</
login-config
>
</
web-app
>