Jetspeed2学习笔记(二)(转载)

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:
 
public static Object
doAs (final Subject subject,
final java.security.PrivilegedAction action);
 
public static Object
doAs (final Subject subject,
final java.security.PrivilegedExceptionAction action)
throws java.security.PrivilegedActionException;
};
 
8、
一个演示第一个doAs方法的例子:
假设有个用户叫 Bob ,他已经通过了 LoginContext (登陆)验证,随后,一个拥有 com.ibm.security.Principal 标识的 subject 产生了,这个 Principal 被命名为“ Bob ”。同时假设 SecurityManager 已经安装,并且访问策略文件( PolicyFile )存在,并定义如下:
 
 
// 授予 "BOB" 访问(读)文件 "foo.txt" 的许可
grant Principal com.ibm.security.Principal "BOB" {
permission java.io.FilePermission "foo.txt", "read";
};
以下是本应用的代码:
class ExampleAction implements java.security.PrivilegedAction {
public Object run() {
java.io.File f = new java.io.File("foo.txt");
// 以下代码将会触发一个安全检测 ( 通过 Policy)
if (f.exists()) {
System.out.println("File foo.txt exists");
}
return null;
}
}
public class Example1 {
public static void main(String[] args) {
// 验证并鉴别用户 "BOB" ,这个过程在 LoginContext 那章中有描述
Subject bob;
// 在验证阶段,将 bob 与此 Subject 相关联
// "BOB" 的身份执行 "ExampleAction"
Subject.doAs(bob, new ExampleAction());
}
}
 
在执行过程中, 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”文件,这个文件控制区域的内容
Jetspeed2学习笔记(二)(转载)_第1张图片
 
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") : "";

你可能感兴趣的:(Jetspeed2学习笔记(二)(转载))