6、
一个Subject也许会与一个
AccessControlContext
联系在一起,可以通过如下方法返回一个与
AccessControlContext
联系在一起的
subject
:
public static Subject getSubject(final AccessControlContext acc);
|
7、
一个特定的
Subject
通过
doAs
方法来执行一个特定的操作(
Action
),原文如下:
The following static methods may be called to perform an action as a
particular Subject:
|
8、
一个演示第一个doAs方法的例子:
假设有个用户叫
Bob
,他已经通过了
LoginContext
的(登陆)验证,随后,一个拥有
com.ibm.security.Principal
标识的
subject
产生了,这个
Principal
被命名为“
Bob
”。同时假设
SecurityManager
已经安装,并且访问策略文件(
PolicyFile
)存在,并定义如下:
以下是本应用的代码:
在执行过程中,
ExampleAction
在调用
f.exists()
时将遭遇一个安全检测。由于执行
ExampleAction
的是
BOB
,而在策略(
Policy
)文件中,已经赋予了
Bob
有此操作的相关权限,
ExampleAction
将通过安全检测。如果策略被改变的话,一个
SecurityException
的错误将被抛出。
|
9、
Principals
用于描述
Subject
的身份,其必须继承
java.security.Principal
和
java.io.Serializable
接口
10、
LoginContext
提供了
4
中构造器,如下:
public LoginContext(String name) throws LoginException;
public LoginContext(String name, Subject subject) throws
LoginException;
public LoginContext(String name, CallbackHandler callbackHandler)
throws LoginException
public LoginContext(String name, Subject subject,
CallbackHandler callbackHandler) throws LoginException
|
它们都统一有个参数
name
,这个参数指定了验证所使用的
LoginModul
Jaas
配置文件如下:
WorkDesk {
net.joinwork.bpm.workdesk.LoginModule required;
};
|
//
用
LoginContext
实例化一个新的
Subject
LoginContext lc = new LoginContext("WorkDesk");
try {
//
验证这个
Subject
lc.login();
System.out.println("
验证成功!
");
//
获得被验证成功的
Subject
Subject subject = lc.getSubject();
...
//
办完事
–
退出
lc.logout();
} catch (LoginException le) {
System.err.println("authentication unsuccessful: " +le.getMessage());
}
|
10、
要配置如下图所示的区域,可以编辑pages目录下的:“folder.metadata”文件,这个文件控制区域的内容

11、
Portlet规范明确定义了Portlet应用如何使用“用户属性”,首先,必须在protlet.xml文件中定义属性如下:
<portlet-app version="1.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> <user-attribute> <description>User Given Name</description> <name>user.name.given</name> </user-attribute> <user-attribute> <description>User Last Name</description> <name>user.name.family</name> </user-attribute> <user-attribute> <description>User eMail</description> <name>user.home-info.online.email</name> </user-attribute> ...
</portlet-app>
|
一旦属性如上定义,当前的portlet就可以利用PortletRequest 中定义的USER_INFO常量来从登陆用户处以无法更改的Map数据格式来获得当前的值,代码如下:
Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO); String givenName = (userInfo!=null)? (String)userInfo.get("user.name.given") : ""; String lastName = (userInfo!=null) ? (String)userInfo.get("user.name.family") : "";
String email = (userInfo!=null) ? (String)userInfo.get("user.home-info.online.email") : "";
|